

# やりたい事

1991年生まれと、1981年生まれの有名人が何人いるか調べてください。ただし、日付関数は使用せず、UNION句を使用してください。

[![Image from
Gyazo](https://i.gyazo.com/30d5a3984d92ae79b31163e4d9e8be25.png)](https://gyazo.com/30d5a3984d92ae79b31163e4d9e8be25)

# コード

[code]

    SELECT 
    COUNT(birth),
    SUBSTRING(birth,1,4) AS '誕生年'
    FROM 
    `celebrities` 
    WHERE birth >= '1991/1/1' AND birth <= '1991/12/31'
    UNION
    SELECT 
    COUNT(birth),
    SUBSTRING(birth,1,4) AS '誕生年'
    FROM 
    `celebrities` 
    WHERE birth >= '1981/1/1' AND birth <= '1981/12/31'
    
[/code]

# 現状

SUBSTRINGで、誕生年数を切り出す事は出来ました。  
後はカウント関数で数を変えるだけだと思った所、このようなエラーが出てしまいます。  
分かる方居ましたらお願いします

[code]

    #1140 - In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'world.celebrities.birth'; this is incompatible with sql_mode=only_full_group_by
    
[/code]


CC BY-SA 4.0
2022-07-08T06:55:09.760
89834
2022-07-09T14:46:10.770
2022-07-09T12:46:29.490
53417
53417
question
mysql sql
1991年生まれと1981年生まれの人数を調べたい。


`count`などの集計関数には初心者に分かりにくい特徴がありまして、 **集計対象外のカラム** をselectしたい場合には`group
by`が必要になります。  
ただし今回の設問では`UNION`の使用を条件としているので、コメントのリンク先を書き換えた下記の回答を意図しているのかもしれません。

[code]

    SELECT '1991' AS '誕生年', COUNT(id)
    FROM celebrities
    WHERE SUBSTRING(birth, 1, 4) = '1991'
    UNION
    SELECT '1981', COUNT(id)
    FROM celebrities
    WHERE SUBSTRING(birth, 1, 4) = '1981'
    
[/code]

ご質問のように、`substring`で誕生年を取得する素直な対応方法として下記のSQLも`group by`を使用して同様の結果を導けます。  
(習っていないであろうwith句を使っている時点で若干素直ではないですが)

[code]

    with bys
    as  (select  id,  substring(birth, 1, 4) '誕生年'
         from    celebrities)
    select 誕生年,
           count(1)
    from   bys
    where  誕生年 = 1991
    group by 誕生年
    union all
    select 誕生年,
           count(1)
    from   bys
    where  誕生年 = 1981
    group by 誕生年
    order by 誕生年
    
[/code]


CC BY-SA 4.0
2022-07-09T13:49:35.570
89868
2022-07-09T14:46:10.770
2022-07-09T14:46:10.770
9820
9820
89834
answer