0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[SQL]CASE式の中で集約関数を使う

Last updated at Posted at 2022-08-12

いきなりですが、以下のようなテーブルから
①一つのチームにしか所属してない人はそのチームID
②複数のチームに所属している人はメインチームID
を取得するとします。

p_id p_name team_id team_name is_main_team
1 いちろう 1 チームA True
1 いちろう 2 チームE False
1 いちろう 3 チームY False
2 よしお 1 チームA False
2 よしお 3 チームE True
3 ごろう 4 チームH False
4 うえい 5 チーム! False

色々なやりかたがあると思いますが、ぱっと思いつくのは
①、②それぞれについてselectを書き、unionするとかでしょうか。

それでも必要な結果は得られますが、複数回のテーブルアクセス等、
パフォーマンス面で無駄が発生します。

以下のSQLのように、CASE式と集約関数を組み合わせることで、
一つのselectで条件に沿ったデータの取得が行えます。

SQL

SELECT 
	p_id,p_name,
  --一つのチームにのみ所属してる人
	CASE WHEN COUNT(*) = 1 THEN MAX(team_id)
    --複数チームに所属してる人
	ELSE
		MAX(
            CASE WHEN is_main_team = 1 THEN team_id
    		ELSE NULL 
            END
        )
	END AS main_team
FROM 
	test1
GROUP BY 
	p_id,p_name
ORDER BY
	p_id

実行結果

p_id p_name team_id
1 いちろう 1
2 よしお 3
3 ごろう 4
4 うえい 5

M根さん「いやそのまえに、このテーブルどうですの。」
M根さん「正規化もクソもあらへんやん。」
ワイ「ワイが来た時には既にこうでした。」

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?