Mysql获取带有计数的子列表

时间:2014-01-24 12:42:37

标签: mysql sql select group-by pivot

我有这种形式的表数据。

it w count
i1 a 2  
i1 b 3
i2 a 1
i3 c 2
i4 b 1

当我为每个项目(它)和相应的计数查询a-b对时。如果某个项目(它)没有a和b,那么它将被忽略(如i3)。我需要以

的形式输出
it a b 
i1 2 3
i2 1 0
i4 0 1

任何想法如何解决这个问题? 而且我不能将每个单词存储在不同的列中。这个矩阵有很多单词和mXn矩阵是稀疏的。

根据Saharsh的回答,我们可以通过

来完成
SELECT * FROM (SELECT a.it, SUM(CASE WHEN a.w = 'a' THEN a.count ELSE 0 END) AS a,
SUM(CASE WHEN a.w = 'b' THEN a.count ELSE 0 END) AS b 
FROM tableA a WHERE a.w IN ('a', 'b') GROUP BY a.it) WHERE a>0 OR b>0

处理数百万行的数据有更好的方式吗?

2 个答案:

答案 0 :(得分:0)

您可以使用条件聚合执行此操作:

select it, max(case when w = 'a' then count else 0 end) as a,
       max(case when w = 'b' then count else 0 end) as b
from table t
where w in ('a', 'b')
group by it;

答案 1 :(得分:0)

试试这个:

SELECT a.it, 
       SUM(CASE WHEN a.w = 'a' THEN a.count ELSE 0 END) AS a, 
       SUM(CASE WHEN a.w = 'b' THEN a.count ELSE 0 END) AS b
FROM tableA a 
WHERE a.w IN ('a', 'b')
GROUP BY a.it;

选中此SQL FIDDLE DEMO

<强>输出

| IT | A | B |
|----|---|---|
| i1 | 2 | 3 |
| i2 | 1 | 0 |
| i4 | 0 | 1 |