今回はSQL ServerのCASE文を紹介です!
CASEを使うとSQL内で条件分岐が出来るため、場合分けした値を出すことが出来ます。

新米太郎
CASE文を覚えると
SQLで出来ることの幅がグッと広がります!
環境構築
SQL Serverの環境構築がまだの人はコチラをどうぞ!

【SQL Server】環境構築方法 インストールからテーブル作成までを解説
SQLserverの環境構築・初期設定方法とインストールからテーブル作成までを解説。スクリーンショットを載せているので、手順通りに進めれば問題なく構築できるはずです。無料で使えるSQLにはいくつも種類がありますが、SQLserverもおすすめできる物の1つです。
CASE文の使い方
テーブル名:sample_case
id | name | sex |
A001 | 山田 | 男 |
A002 | 山下 | 女 |
A003 | 新米 | 男 |
A004 | 鈴木 |
サンプルデータを利用して、実際に実行してみてください!
--[sample_case]テーブル作成 CREATE TABLE [sample_case] ( [id] nvarchar(10) NOT NULL PRIMARY KEY , [name] nvarchar(50) NOT NULL , [sex] char(10) NOT NULL ); --レコード挿入 INSERT INTO [sample_case] VALUES ('A001', '山田', '男') , ('A002', '山下', '女') , ('A003', '新米', '男') , ('A004', '鈴木', ''); --全件表示 SELECT * FROM sample_case;
パターン1:単純CASE式
単純CASE式と言われる、値と一致するものを探すパターン
CASE 検索値 WHEN 値1 THEN 一致した場合の返却値 WHEN 値2 THEN 一致した場合の返却値 ELSE どれにも該当しな場合の返却値 END
実行例
表の’sex’列に対してCASEを使ってみます
SELECT id, name , CASE sex WHEN '男' THEN 1 WHEN '女' THEN 2 ELSE 0 END AS 'name' FROM sample_case;
<実行結果>
id | name | sex |
A001 | 山田 | 1 |
A002 | 山下 | 2 |
A003 | 新米 | 1 |
A004 | 鈴木 | 0 |
‘sex’列が
男なら1
女なら2
それ以外0
と置き換わっています
パターン2:検索CASE式
検索CASE式と言われる、条件と一致するものを探すパターン
CASE WHEN 条件1 THEN 一致した場合の返却値 WHEN 条件2 THEN 一致した場合の返却値 ELSE どれにも該当しな場合の返却値 END
実行例
表の’sex’列に対してCASEを使ってみます
SELECT id, name , CASE WHEN sex = '男' THEN 1 WHEN sex = '女' THEN 2 ELSE 0 END AS 'name' FROM sample_case;
<実行結果>
id | name | sex |
A001 | 山田 | 1 |
A002 | 山下 | 2 |
A003 | 新米 | 1 |
A004 | 鈴木 | 0 |
こちらも’sex’列が
男なら1
女なら2
それ以外0
と置き換わっています
CASE文を使った便利な集計
テーブル名:sample_case2
name | type | qty |
開発部 | デスクトップ | 50 |
開発部 | ノート | 15 |
人事部 | デスクトップ | 20 |
人事部 | ノート | 10 |
営業部 | デスクトップ | 5 |
営業部 | ノート | 30 |
総務部 | デスクトップ | 19 |
総務部 | ノート | 8 |
--[sample_case2]テーブル作成 CREATE TABLE [sample_case2] ( [name] nvarchar(10) NOT NULL , [type] nvarchar(50) NOT NULL , [qty] int NOT NULL ); --レコード挿入 INSERT INTO [sample_case2] VALUES ('開発部', 'デスクトップ', 50) , ('開発部', 'ノート', 15) , ('人事部', 'デスクトップ', 20) , ('人事部', 'ノート', 10) , ('営業部', 'デスクトップ', 5) , ('営業部', 'ノート', 30) , ('総務部', 'デスクトップ', 19) , ('総務部', 'ノート', 8) --全件表示 SELECT * FROM [sample_case2];
このようなテーブルから
部ごとに’デスクトップ’と’ノート’の数量を集計したいときはどうすれば良いでしょうか?
<集計したい表>
name | デスクトップ | ノート |
営業部 | 5 | 30 |
開発部 | 50 | 15 |
人事部 | 20 | 10 |
総務部 | 19 | 8 |
CASEを使ったSQL
このようなSQLで集計が出来ます!
SELECT name -- デスクトップの集計 , SUM(CASE WHEN type = 'デスクトップ' THEN qty ELSE 0 END ) AS 'デスクトップ' -- ノートの集計 , SUM(CASE WHEN type = 'ノート' THEN qty ELSE 0 END ) AS 'ノート' FROM [sample_case2] GROUP BY name
集計にCASE文を利用することで‘デスクトップ’と‘ノート’を別々に集計しています。
デスクトップの集計では、SUM関数内のCASE文が
デスクトップならqtyを、それ以外は0を返すので
結果としてデスクトップのみ集計が出来ています。
ノートの集計も同様です。
最後に
いかがだったでしょうか?
今回はSQLを扱うなら絶対に覚えておきたいCASE文の紹介でした。

新米太郎
お読み頂きありがとうございました!
コメント