行に出力されるanest_nameを横に1列に出力したいとき、、、勉強中2019年4月14日
proc_id順に、anest_nameを横に1列に出力したいときにどんなクエリを書けばよいのか勉強中。
SQLを勉強していて一番ややこしいのがこれ。
SQLの出力はたいてい行単位で出力する。考え方はループで1行ごとに処理をする。
ところが、その行を横に並べたいとき、凡人の頭はこんがらがる。
それをMAXが解決してくれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/* */ 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--そのままでは行ごとに別々になって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 |