2012-03-07 89 views
0

我有一个MySQL表:简单的表格。很难要求

level  box 
1   1 
2   2 
3   2 
1   3 
2   1 
2   3 
2   3 
3   1 

我怎样才能得到这个表与MySQL查询?

  box1  box2   box3 
level1 1  0   1 
level2 1  1   2 
level3 1  1   0 

我有一张大桌子,所以请求应该很快。 谢谢。

+2

固定的箱数? – 2012-03-07 19:47:42

+0

是的。只有3盒和3个等级。谢谢。 – user889349 2012-03-07 19:49:06

回答

2

我认为这应该做到这一点,虽然可能有更有效的方法或不需要聚合。

编辑:最初我误解了要求。改变了MAX()骨料COUNT()

SELECT 
    CONCAT('level', level) AS levelname, 
    COUNT(CASE WHEN box = 1 THEN box ELSE NULL END) AS box1, 
    COUNT(CASE WHEN box = 2 THEN box ELSE NULL END) AS box2, 
    COUNT(CASE WHEN box = 3 THEN box ELSE NULL END) AS box3 
FROM tbl 
GROUP BY levelname 

使用JOIN是另一个方法:

SELECT 
    CONCAT('level', a.level) AS levelname, 
    b1.num AS box1, 
    b2.num AS box2, 
    b3.num AS box3 
FROM 
    table a 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 1) b1 ON a.level = b1.level 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 2) b2 ON a.level = b2.level 
    LEFT JOIN (SELECT level, COUNT(*) AS num FROM table WHERE box = 3) b3 ON a.level = b3.level 
+0

你不想要COUNT(),而不是MAX()? – CAbbott 2012-03-07 19:53:32

+0

@CAbbott如果没有重复,则无关紧要。但是,如果存在模糊(因为它出现在示例数据中),则SUM()将返回不同的结果集。例如,等级2的方框3的值由'SUM()'为6,但由'MAX()'为3。 – 2012-03-07 19:54:46

+0

@CAbbott其实,我误解了需求 - 它应该是'COUNT()'。 – 2012-03-07 19:56:39