2016-05-13 35 views
1

我想获得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 

现在是我的曲estion如何确保在所有column1聚合中column2的值相同?在这个例子的情况下,我错过了

ab;bb;0 

所以,我想,对于列1的每个值我有相同的一组为列2的值。这实际上意味着一个缺失的值被0填充为count。

+0

请查看[如何提出一个好问题](http://stackoverflow.com/help/how-to-ask)。这是一种礼貌的说法,你必须投入最少的努力,这在这里并不明显。 –

+0

你的问题不清楚。请修改。 –

+0

@JarrodRoberson对不起,把它放在小提琴中,并添加了一些进一步的解释。希望现在清楚。 – faulix90

回答

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; 
+0

非常好的解决方案和解释,谢谢。 – faulix90

0

的想法基本上是把所有的组合,并使用加入或工会填补了国内空白,我在这里使用UNION ALL 。

SELECT 
    column1 
    ,column2 
    ,count(column3) 
from (
select column1, column2, column3 from table1 
union all 
select column1,column2, null as column3 
    from (select distinct column1 from table1) all_c1 
    cross join (select distinct column2 from table1) all_c2 
)t group by column1, column2; 
+0

非常感谢,但@Solarflare的解决方案稍微优雅一点(在我看来)。 – faulix90

相关问题