問題
CASEを使った既存の体系を新たな体系に変換した集計をやっていきます。
Tests
という仮のテーブルがあるとします。
key | greatest |
---|---|
A | 2 |
B | 5 |
C | 7 |
D | 3 |
任意の順番(B→A→D→C)に並び替えるクエリを書いてください。
補足
そもそも、こんなクエリを発行させないといけないようなテーブルがおかしいですが、クエリの勉強だと思ってください。
仮定として、テーブル自体を見直した方がいいような設計であるとします。今回は仮に、ソート用の列が存在せず、ソートさせた結果が欲しいとします。
本来、SQL(SELECT)の仕事はデータ検索です。結果の見た目の整形は本来の役割ではありませんが、時としてクエリに頼らざるを得ない場面はありますよね?(僕はありました)
そういうシーンであると仮定して欲しいです。
SQL
SELECT key
FROM Tests
ORDER BY CASE key
WHEN 'B' THEN 1
WHEN 'A' THEN 2
WHEN 'D' THEN 3
WHEN 'C' THEN 4
ELSE NULL
END;
ソート列も出力させたいのなら
SELECT
key,
CASE key
WHEN 'B' THEN 1
WHEN 'A' THEN 2
WHEN 'D' THEN 3
WHEN 'C' THEN 4
ELSE NULL
END AS sort_col
FROM Tests
ORDER BY sort_col;
ちなみにこの書き方は 以前書いた記事👇 に似てますね。これらは、最初に書いたSQLよりも標準的なSQLにのっとってます。
なぜなら、ORDER BY
はSELECT
よりも後に実行されるので、SELECT句で作られた計算列(今回なら: sort_col
)を参照できるからです。
SELECT文の処理の実行順序
FROM // 検索対象のテーブルが決定
↓
WHERE // 条件による絞り込み
↓
GROUP BY // グループ化
↓
SELECT // SELECTに記述された計算が実行
↓
HAVING // グループ化された結果を条件によって絞り込み
↓
ORDER BY // ソート
↓
LIMIT // 指定された行数で絞り込む
参照
25p
アウトプット100本ノック実施中