我的数据看起来像这样
+-----+-----+
| A | B |
+-----+-----+
| 1 | a |
| 1 | a |
| 1 | b |
| 1 | b |
| 1 | c |
| 2 | a |
| 2 | a |
| 2 | b |
| 3 | b |
| 3 | a |
+-----+-----+
我需要一个能给我这样的查询。
+-----+-----+-----+
| A | B | sum |
+-----+-----+-----+
| 1 | a+b | 4 |
| 1 | c+d | 1 |
| 2 | a+b | 3 |
| 2 | c+d | 0 |
| 3 | a+b | 2 |
| 3 | c+d | 0 |
+-----+-----+-----+
更具体地说,在withCriteria中的grails中。我可以让它工作,或调整它是否是直接的mysql。我需要按A分组,但希望辅助组B是2个不同值的组合,然后是B中该组合计数的总和。
我已经看过一些类似于使用CASE的例子,但还没有看到他们将列中的值组合在一起以获得计数。
答案 0 :(得分:2)
这有点棘手,因为您想显示不存在的记录的ID。您可以使用子查询和cross join
来执行此操作。然后使用outer join
返回原始表格并conditional aggregation
获取结果:
select t.a, t.b,
count(case when t.b = 'a+b' and y.b in ('a','b') then 1
when t.b = 'c+d' and y.b in ('c','d') then 1
end)
from (
select distinct t.a,
t2.b
from yourtable t
cross join (select 'a+b' b union all select 'c+d') t2
) t left join yourtable y on t.a = y.a
group by t.a, t.b