通过聚合函数重复多级组的所有级别上的所有值

时间:2016-05-13 17:29:09

标签: mysql group-by aggregate

我想得到colum3的计数,但我想按column1和column2对它进行分组,其中column2始终具有column2的相同(所有)值。

我当前的版本:http://sqlfiddle.com/#!9/00d9d/1/0

代码:

CREATE TABLE table1
    (`column1` varchar(2), `column2` varchar(2), `column3` varchar(2))
;

INSERT INTO table1
    (`column1`, `column2`, `column3`)
VALUES
    ('aa', 'ba', 'ca'),
    ('aa', 'ba', 'cb'),
    ('aa', 'ba', 'cc'),
    ('aa', 'bb', 'ca'),
    ('aa', 'bb', 'cb'),
    ('aa', 'bc', 'ca'),
    ('aa', 'bc', 'cb'),
    ('aa', 'ba', 'ca'),
    ('ab', 'ba', 'cb'),
    ('ab', 'bc', 'ca')
;

我的查询:

SELECT 
         column1
         ,column2
         ,COUNT(column3) 
    FROM 
         table1
    GROUP BY 
         column1
         ,column2

结果

column1 column2 COUNT(column3)
aa  ba  4
aa  bb  2
aa  bc  2
ab  ba  1
ab  bc  1

现在我的问题是如何确保所有column1聚合中的column2值相同?如果是示例,我会错过

ab;bb;0

所以我希望对于column1的每个值,我对column2都有相同的值集。这实际上意味着缺失的值会被0填充为计数。

2 个答案:

答案 0 :(得分:0)

您必须首先生成所有允许的值(column1 x column2),然后使用您的查询生成left join。您的查询将提供它知道的计数,否则您将获得0:

select base1.column1, base2.column2, ifnull(YourQuery.cnt, 0)
from (select distinct column1 from table1) as base1 
cross join (select distinct column2 from table1) as base2
left join 
(SELECT column1,column2,COUNT(column3) as cnt
 FROM table1
 GROUP BY column1,column2
) as YourQuery
on YourQuery.column1 = base1.column1 and YourQuery.column2 = base2.column2;

答案 1 :(得分:0)

这个想法基本上是为了获得所有组合并使用join或union来填补空白,我在这里使用union all。

ev