【SQL Server】絶対に覚えておきたいCASE文 SQLで条件分岐をしてみよう!





今回は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文の紹介でした。

 

新米太郎
新米太郎

お読み頂きありがとうございました!




コメント

タイトルとURLをコピーしました