2012-12-18 56 views
1

我想要显示像这样的数据我在哪里GROUPDATEMySql的多列从单列表选择与分组

Date  Star1 Star2 Star3 Star4 Star5 
2012-10-25 null null null  1  1 

我目前的表有三(3)列,显示:

ID DATE  RATING 
5 2012-10-25 4 
6 2012-10-25 5 

我使用此查询来尝试实现上述数据:

SELECT 
    DATE, 
    CASE 
     WHEN RATING = 1 THEN 1 
     ELSE NULL 
    END AS STAR1, 
    CASE 
     WHEN RATING = 2 THEN 1 
     ELSE NULL 
    END AS STAR2, 
    CASE 
     WHEN RATING = 3 THEN 1 
     ELSE NULL 
    END AS STAR3, 
    CASE 
     WHEN RATING = 4 THEN 1 
     ELSE NULL 
    END AS STAR4, 
    CASE 
     WHEN RATING = 5 THEN 1 
     ELSE NULL 
    END AS STAR5 
FROM 
    table1 
WHERE 
    DATE = '2012-10-25' 
GROUP BY DATE 
ORDER BY DATE 

这只能吐出一个等级寿:

Date  Star1 Star2 Star3 Star4 Star5 
2012-10-25 null null null null  1 

它像它不是在日期分组,我怎么能做到这一点?

回答

3

MySQL允许这样的查询有点令人惊讶,因为GROUP BY并未涵盖SELECT列表中的所有非聚合列。

如果你换你的CASE语句为计数,那么我想你会与你想要的结束:

SELECT 
    DATE, 
    COUNT(CASE 
     WHEN RATING = 1 THEN 1 
     ELSE NULL 
    END) AS STAR1, 
    COUNT(CASE 
     WHEN RATING = 2 THEN 1 
     ELSE NULL 
    END) AS STAR2, 
    COUNT(CASE 
     WHEN RATING = 3 THEN 1 
     ELSE NULL 
    END) AS STAR3, 
    COUNT(CASE 
     WHEN RATING = 4 THEN 1 
     ELSE NULL 
    END) AS STAR4, 
    COUNT(CASE 
     WHEN RATING = 5 THEN 1 
     ELSE NULL 
    END) AS STAR5 
FROM 
    table1 
WHERE 
    DATE = '2012-10-25' 
GROUP BY DATE 
ORDER BY DATE 

请让我知道你是怎么用这种方法做的。

+0

这工作谢谢你! – ToddN

+0

太棒了!很高兴我能帮上忙。 – MikeB

1
SELECT 
DISTINCT DATE, 
(SELECT COUNT(RATING) FROM Table1 WHERE RATING = '1') AS Star1, 
(SELECT COUNT(RATING) FROM Table1 WHERE RATING = '2') AS Star2, 
(SELECT COUNT(RATING) FROM Table1 WHERE RATING = '3') AS Star3, 
(SELECT COUNT(RATING) FROM Table1 WHERE RATING = '4') AS Star4, 
(SELECT COUNT(RATING) FROM Table1 WHERE RATING = '5') AS Star5 
FROM 
Table1 
WHERE 
DATE = '2012-10-25' 
GROUP BY DATE 
ORDER BY DATE 
+0

您不希望(或需要)在这里使用DISTINCT子句。如果你打算使用子选择,你想确保它们是相关的。 – MikeB

+0

但它有效=) – Gutenberg