2014-09-30 40 views
0

下表试想:有GROUP BY多个值给我的所有可能的组合

type cond 
A good 
A good 
A bad 
B good 
B bad 
C good 
C bad 
D good 
D bad 
E worse 

如果我算和组双方typecond我会得到这样的:

count type cond 
2  A good 
1  A bad 
1  B good 
1  B bad 
1  C good 
1  C bad 
1  D good 
1  D bad 
1  E worse 

但对于更好地将数据总结成表格我宁愿喜欢这样的结果:

count type cond 
2  A good 
1  A bad 
0  A worse 
1  B good 
1  B bad 
0  B worse 
1  C good 
1  C bad 
0  C worse 
1  D good 
1  D bad 
0  D worse 
0  E good 
0  E bad 
1  E worse 

我已经设法交叉加入所有现有的type s与所有现有的cond s,但我不能再计算了。 我也尝试将结果与所有现有的type s或cond s结合,但这也不起作用。

SUM-CASE-WHEN策略在这里不起作用,因为我想让它具有动态性,即我不知道会有多少个typecond

是否有一个简单的(甚至是复杂的)解决方案来生成分组数据的线性矩阵? (奖励:...甚至调换它,即二维矩阵,有一个组的表头?)

+0

有你值父表中的 “好”, “坏”, “雪上加霜”? – 2014-09-30 07:37:07

+0

@JoeTaras:我没有一个包含所有可能条件的表,但它可以通过'SELECT cond FROM table GROUP BY cond'动态地合成(并嵌套,如果需要的话)' – dulange 2014-09-30 07:39:47

+0

Ook,关于规范化,最好是你有一张表那些价值。 – 2014-09-30 08:00:33

回答

0

试试这个:

SELECT 
    COUNT(c.type) as `count`, a.type, b.cond 
FROM (
    SELECT DISTINCT type 
    FROM table_name 
) a 
    CROSS JOIN (
    SELECT DISTINCT cond 
    FROM table_name 
) b 
    LEFT JOIN 
    table_name c ON c.type = a.type AND c.cond = b.cond 
GROUP BY a.type, b.cond 
ORDER BY a.type, b.cond 

测试:SQL Fiddle

编辑:

要在一个组中以二维矩阵的形式显示结果作为表头,必须在运行查询之前知道组名称。查询可以是:

SELECT 
    a.type, 
    COUNT(CASE WHEN b.cond = 'good' THEN c.type ELSE NULL END) as good, 
    COUNT(CASE WHEN b.cond = 'bad' THEN c.type ELSE NULL END) as bad, 
    COUNT(CASE WHEN b.cond = 'worse' THEN c.type ELSE NULL END) as worse 
FROM (
    SELECT DISTINCT type 
    FROM table_name 
) a 
    CROSS JOIN (
    SELECT DISTINCT cond 
    FROM table_name 
) b 
    LEFT JOIN 
    table_name c ON c.type = a.type AND c.cond = b.cond 
GROUP BY a.type 
ORDER BY a.type 

测试:SQL Fiddle

0

为了更好的数据结构必须有一个表cond anagraph但是......

你可以用两个子查询,一个建立自己的笛卡尔乘积对于所有类型和所有类型的情况,因此,您在SELECT字段中有一个子查询,您可以计算这些情侣的元素。

试试这个:

CREATE TABLE app(type char, cond varchar(10)); 

INSERT INTO app values 
('A', 'good'), 
('A', 'good'), 
('A', 'bad'), 
('B', 'good'), 
('B', 'bad'), 
('C', 'good'), 
('C', 'bad'), 
('D', 'good'), 
('D', 'bad'), 
('E', 'worse') 

select t1.cond, t2.type, (select count(*) from app a3 where a3.cond = t1.cond 
and (a3.type = t2.type)) as total 
from 
    (select distinct cond 
    from app a1) as t1 
cross join 
    (select distinct type 
    from app a2) as t2 
order by t2.type, t1.cond 

Show SqlFiddle

0
select 
    A.type, 
    A.cond, 
    case 
     when B.cnt is null then 0 
     else B.cnt 
    end 
from 
    (select 
     type, cond 
    from 
     (SELECT distinct 
     cond 
    from 
     package) 
    cross join (select distinct 
     type 
    from 
     package)) A 
     left join 
    (select 
     type, cond, count(*) as cnt 
    from 
     package 
    group by type , cond) B ON A.cond = B.cond and A.type = B.type 
order by type 
+0

有人可以缩进它不能 – 2014-09-30 09:12:17