- ベストアンサー
縦を横にするSQLを教えてください
以下縦長に延々とある出勤テーブルをシフトテーブルのようにまとめたいのですが 方法が分かりません。ご教授願います。 出勤テーブル 山田,月 佐藤,木 山田,水 鈴木,火 佐藤,金 ・・・ ・・・ シフトテーブル 名前,月,火,水,木,金,土,日 山田, 1, , 1, , , , 佐藤, , , , 1, 1, , 鈴木, , 1, , , , , ・・・ ・・・
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
↓のページに載っている問題と同じですね。 http://codezine.jp/article/detail/751?p=1 スカラサブクエリを使った場合は下記の様な感じになるでしょう。 SELECT 名前, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '月') AS 月, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '火') AS 火, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '水') AS 水, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '木') AS 木, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '金') AS 金, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '土') AS 土, (SELECT 1 FROM 出勤テーブル b WHERE a.名前 = b.名前 AND 曜日 = '日') AS 日 FROM (SELECT DISTINCT 名前 FROM 出勤テーブル) a ORDER BY 名前;
その他の回答 (1)
- nora1962
- ベストアンサー率60% (431/717)
日付がどうなっているか分かりませんが、一週間分なら select 名前, case when count(distinct 月) = 1 then 1 else null end 月, case when count(distinct 火) = 1 then 1 else null end 火, case when count(distinct 水) = 1 then 1 else null end 水, case when count(distinct 木) = 1 then 1 else null end 木, case when count(distinct 金) = 1 then 1 else null end 金, case when count(distinct 土) = 1 then 1 else null end 土, case when count(distinct 月) = 1 then 1 else null end 日 from ( select 名前, case when 曜日 = '月' then 1 else null end 月, case when 曜日 = '火' then 1 else null end 火, case when 曜日 = '水' then 1 else null end 水, case when 曜日 = '木' then 1 else null end 木, case when 曜日 = '金' then 1 else null end 金, case when 曜日 = '土' then 1 else null end 土, case when 曜日 = '日' then 1 else null end 日 from 出勤テーブル ) Q group by 名前
お礼
ありがとうございます。助かりました。
お礼
ありがとうございます。記事が大変参考になりました。