按列A分组,列B中的值组合并获得B的总和

时间:2016-08-02 20:21:00

标签: mysql grails

我的数据看起来像这样

+-----+-----+
|  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的例子,但还没有看到他们将列中的值组合在一起以获得计数。

1 个答案:

答案 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