0

私の質問から受け取った答えとして、なんらかの理由でコードに適用することに夢中になり、なぜそれが機能しなかったのか。

これがテーブル上の私のデータの一部です。

ここに画像の説明を入力

元のコード:

SELECT AGE_RANGE, COUNT(*) FROM (
    SELECT CASE
        WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5'
        WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10'
        WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15'
        WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20'
        WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30'
        WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40'
        WHEN YearsOld > 40 THEN '40+'
        END AS 'AGE_RANGE'
        FROM (
            SELECT YEAR(CURDATE())-YEAR(DATE(birthdate)) 'YearsOld' 
            FROM MyTable
        ) B
) A
GROUP BY AGE_RANGE

これが結果です。

ここに画像の説明を入力

私がやろうとしているのは、パース、西オーストラリア、サンベリーを含む上の写真に見られるように、その地域に何人の人がいるかをカウントする別の列を追加しようとしていることです. 、ビクトリアなど。

問題を解決するための最初の試み

以下に示すように、場所と COUNT(location) loc を追加して、場所の名前を取得し、テーブル内で重複している場所の数を数えます。

SELECT AGE_RANGE, COUNT(*), location, COUNT(location) loc FROM (
    SELECT CASE
        WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5'
        WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10'
        WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15'
        WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20'
        WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30'
        WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40'
        WHEN YearsOld > 40 THEN '40+'
        END AS 'AGE_RANGE', 'location'
        FROM (
            SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld' 
            FROM event_participants
        ) B
) A
FROM event_participants WHERE location <> '' GROUP BY location HAVING loc >= 1 ORDER BY loc DESC LIMIT 5

どの結果に..

ここに画像の説明を入力

明らかに、神の助けから聞くことはうまくいきません..

この問題を修正するための 2 回目の試み

SELECT AGE_RANGE, COUNT(*), location FROM (
    SELECT CASE
        WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5'
        WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10'
        WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15'
        WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20'
        WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30'
        WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40'
        WHEN YearsOld > 40 THEN '40+'
        END AS 'AGE_RANGE', 'location'
        FROM (
            SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld' 
            FROM event_participants
        ) B
) A
GROUP BY AGE_RANGE

そして結果は…

ここに画像の説明を入力

国の名前を表示する代わりに、場所のみを表示します。

良い..

簡単に言えば、コードの何が問題なのですか? このようなものの解決策はありますか?

私の望む結果は、

AGE_RANGE COUNT(*) location            total number of same location

16-20        4     Name of location                 #

21-30       45     Name of location                 #

31-40       79     Name of location                 #

40+        102     Name of location                 #
4

3 に答える 3

1

これを試して

SELECT AGE_RANGE, COUNT(*), location FROM (
        SELECT CASE
            WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5'
            WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10'
            WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15'
            WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20'
            WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30'
            WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40'
            WHEN YearsOld > 40 THEN '40+'
            END AS 'AGE_RANGE', 'location'
            FROM (
                SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld'
                FROM event_participants
            ) B
    ) A
    GROUP BY location, AGE_RANGE
于 2013-06-27T05:54:54.373 に答える
1

これは機能するはずです。各サブクエリを独自のテーブルと考えてください。そのため、必要なすべての列を確実に選択する必要があります。(CASE WHEN THEN END AS) は、実際には単一の列値です。場所ごとにグループ化して、異なる場所で同じ年齢範囲を取得できるようにすることもできます。(例: カナダの 11-15、米国の 11-15)

SELECT AGE_RANGE, COUNT(*), A.location FROM (
        SELECT CASE
            WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5'
            WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10'
            WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15'
            WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20'
            WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30'
            WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40'
            WHEN YearsOld > 40 THEN '40+'
            END AS 'AGE_RANGE', B.location
            FROM (
                SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld',
                location /* << just missing this select */
                FROM event_participants
            ) B
    ) A
    GROUP BY A.location, AGE_RANGE
于 2013-06-27T05:43:41.083 に答える
0

これは正しくありません:-

SELECT AGE_RANGE, COUNT(*), location FROM

select で属性リストを使用する場合はGROUP BY、集計関数に適用するか、GROUP BY句の一部にする必要があります。

age-group以下の例では、 の人物が別の場所に属している可能性があるため、場所の名前を表示することはできません:-

AGE_RANGE COUNT(*) location            total number of same location

16-20        4     Name of location                 #

21-30       45     Name of location                 #
于 2013-06-27T05:45:59.417 に答える