質問: 'Y' THEN club_id ELSE NULL END) END AS main_club FROM StudentClub GROUP BY std_id; std_id|main_club 100 1 200 3 300 4 400 5 500 6 ### 発生している問題・エラーメッセージ SQL文、3行目の「MAX]を外しても出来上がるテーブルに問題はないのですが 4行目の「MAX」を外すと std_id 200 のmain_clubがNULL になるのは何故でしょうか。 そもそも何故、「MAX」が必要なのかが分かりません(>_<) ご教授いただけないでしょうか。 ### 該当のソースコード ``` ソースコード ``` ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: はじめまして > > そもそも何故、「MAX」が必要なのか > > > 簡単な理由(?)としては > > GROUP BY句を使った場合、グループ化した列名以外の > > 列では集計関数(MAX,MIN, AVG や COUNT(*) など...)が必要 > > だからです。 > > > (**GROUP BY句とSQLの集計関数は対で使う**、と覚えておきましょう!) しかし詳細は以下の説明になる、 と思います。 (間違っていたらご指摘ください) SQLにおけるMAX関数の機能は、少し複雑です。 ttps://www.shift-the-oracle.com/sql/aggregate-functions/max.html こちらに詳しい説明があります。 抜粋すると > > NULL は最大値を選択するためのデータに含まれない。 > > 該当データが無い場合、NULL しかデータが存在しない場合には MAX 関数は NULL を戻す。 > > > だからです。 これだと まずMAXがない状態では ``` CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END ・・・ GROUP BY std_id; ``` は std_id 200 では 吹奏楽、バドミントン、サッカーの3つなので [NULL 3 NULL] => NULL 最後のNULLが返ります。 なので 「「MAX」を外すと std_id 200 のmain_clubがNULL」 一方 MAXをつけて ``` MAX(CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END) ・・・ GROUP BY std_id; ``` を実行すると まず CASE ~ GROUP BY std_id; は同じなので [NULL 3 NULL] が来て これをMAX関数で処理するから MAX([NULL 3 NULL]) => MAXは 3 (NULL は最大値を選択するためのデータに含まれない。) std_id 200 のmain_clubは 3 となります。 こういった解釈だと思います。