教えてえらい人:複数行を連結するSQL - 解決編
この本読んでたら、まさにそれに近いスクリプトが載っていたので、今回のケースに合わせてアレンジしたものを記載しておきます。本を持っている人は
SQLクックブック ―データベースエキスパートのための実践レシピ集
- 作者: Anthony Molinaro,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/01/25
- メディア: 大型本
- 購入: 2人 クリック: 84回
- この商品を含むブログ (19件) を見る
の p.118、「レシピ6.10 テーブル行から区切りリストを作成する」を参照してください。なおこのスクリプトはOracle専用です。
SELECT 作業番号 ,LTRIM(SYS_CONNECT_BY_PATH( 製品名 || ' ' || 予定日 || ' ' || 実績日, ','), ',' ) as 作業一覧 FROM( SELECT 製品名 ,ROW_NUMBER() OVER (PARTITION BY 作業番号 ORDER BY 作業番号) rn ,COUNT(*) OVER (PARTITION BY 作業番号) cnt FROM 工程表 ) WHERE LEVEL = cnt START WITH rn = 1 CONNECT BY PRIOR 作業番号 = 作業番号 AND PRIOR rn = rn-1
本来は階層構造を表現するための関数である SYS_CONNECT_BY_PATH() を使うあたりがスゲエと思いました。SQL を仕事で使う人は、読んでおいて決して損のない本だと思います(…ちょっと高いけど)。