SQLSERVER 行に出力されるanest_nameを横に1列に出力したいとき

行に出力されるanest_nameを横に1列に出力したいとき、、、勉強中2019年4月14日

proc_id順に、anest_nameを横に1列に出力したいときにどんなクエリを書けばよいのか勉強中。
SQLを勉強していて一番ややこしいのがこれ。
SQLの出力はたいてい行単位で出力する。考え方はループで1行ごとに処理をする。
ところが、その行を横に並べたいとき、凡人の頭はこんがらがる。
それをMAXが解決してくれる。

/*

*/
SELECT * FROM Procs

proc_id	anest_name	start_time	end_time
10	Baker	08:00:00.0000000	11:00:00.0000000
20	Baker	09:00:00.0000000	13:00:00.0000000
30	Dow	09:00:00.0000000	15:30:00.0000000
40	Dow	08:00:00.0000000	13:30:00.0000000
50	Dow	10:00:00.0000000	11:30:00.0000000
60	Dow	12:30:00.0000000	13:30:00.0000000
70	Dow	13:30:00.0000000	14:30:00.0000000
80	Dow	18:00:00.0000000	19:00:00.0000000


SELECT proc_id,ROW_NUMBER() OVER(PARTITION BY proc_id ORDER BY proc_id) as ROW_NUM FROM Procs

SELECT CASE WHEN proc_id = 10 THEN--これだと行ごとに別々になって1行でできない
		anest_name
		--ELSE
		END as p10,
		CASE WHEN proc_id = 20 THEN
		anest_name
		--ELSE
		END as p20
		FROM Procs


SELECT CASE
		 WHEN
		 proc_id = 10 THEN--これだと行ごとに別々になって1行でできない
			anest_name
		 WHEN 
		 proc_id = 20 THEN
			anest_name
		ELSE
			anest_name
		END as p10
FROM Procs

SELECT CASE
		 WHEN
		 proc_id = 10 THEN--これだと行ごとに別々になって1行でできない
			anest_name
		 END,
		CASE WHEN 
		 proc_id = 20 THEN
			anest_name
		END
FROM Procs
--PIVOT (SUM([売上金額]) FOR [商品名] IN ([なし], [もも], [りんご])) AS PV;
PIVOT (SUM(proc_id) FOR anest_name IN(Baker,Dow)) as PV

SELECT * 
FROM Procs
--PIVOT (SUM([売上金額]) FOR [商品名] IN ([なし], [もも], [りんご])) AS PV;
PIVOT (SUM(START_TIME) FOR Proc_id IN([10],[20],[30])) as PV
--これでももっと勉強すればできそうだけど、よくわからない。
--
--ここにあった
--     CASE 順位 WHEN 1 THEN 製品 ELSE '' END  AS "1位製品",     CASE 順位 WHEN 1 THEN 売上 ELSE NULL END AS "1位売上"
-- MAX(CASE 順位 WHEN 1 THEN 製品 ELSE '' END) AS "1位製品", SUM(CASE 順位 WHEN 1 THEN 売上 ELSE NULL END) AS "1位売上"
SELECT * FROM Procs

面倒だけど、MAXを使うことでできた
以下のサイトを参考にした
https://hgotoh.jp/wiki/doku.php/documents/database/sql-0001

--そのままでは行ごとに別々になって1行でできないのでMAXをつけると横に並ぶ
SELECT MAX(CASE
		 WHEN
		 proc_id = 10 THEN
			anest_name
		 END) AS p10,
		MAX(CASE WHEN 
		 proc_id = 20 THEN
			anest_name
		END) as p20,
		MAX(CASE WHEN 
		 proc_id = 30 THEN
			anest_name
		END) as p30
		,
		MAX(CASE WHEN 
		 proc_id = 40 THEN
			anest_name
		END) as p40--以降同じようにMAX、CASEでつなげる
FROM Procs
ーー>名前が横に並ぶ
p10	p20	p30	p40
Baker	Baker	Dow	Dow

こちらの記事もどうぞ