1

私がいる場所のようなデータを表示しGROUPたいDATE

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

これは、次の1つの評価のみを吐き出します。

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

日付でのグループ化ではないようですが、どうすればこれを達成できますか?

4

2 に答える 2

3

GROUP BY は SELECT リスト内の集約されていないすべての列をカバーするわけではないため、MySQL がそのようなクエリを許可していることは少し驚くべきことです。

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

そのアプローチ方法を教えてください。

于 2012-12-18T21:06:03.237 に答える
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
于 2012-12-18T21:34:43.230 に答える