分组时双重条件计数选择

时间:2015-12-17 22:46:50

标签: sql sql-server

我有一张包含以下相关字段的表格:

$ grep -rl bar > tmp.x
$ grep -rl foo --exclude-from=tmp.x ; rm tmp.x

我想选择所有entity_id | grouping_id | type_id --------------------------------- 1 | 1 | 1 2 | 1 | 1 3 | 1 | 2 4 | 2 | 1 5 | 2 | 2 个值,其中有n个类型的X数和类型为m的Y个数。我最初认为可行的例子:

grouping_id

理论上会返回所有select grouping_id from t_entities group by grouping_id, type_id having count(case type_id when 1 then 1 else null end) = 2 and count(case type_id when 2 then 1 else null end) = 1 值为2的类型1和1的类型2,但因为该子句也是按type_id进行分组,所以我什么都没回来,因为每个组都是独立存在的,但如果我丢弃了按type_id分组然后我得到聚合错误。有没有办法在不使用临时表的情况下将其作为原始查询?

1 个答案:

答案 0 :(得分:1)

根据您的查询,您走在正确的轨道上,但不是按type_id进行分组,而应该按grouping_id进行分组。通过按type_id进行分组,您无法获得具有两个不同值的内容,因此and中的having条款无法使用。您应该能够执行以下操作以返回grouping_id =1作为结果:

select grouping_id 
from t_entities
group by grouping_id
having count(case type_id when 1 then 1 else null end) = 2
  and count(case type_id when 2 then 1 else null end) = 1;

请参阅SQL Fiddle with Demo