さり海馬

Thoughts walk away, blog stays.

教えてえらい人:複数行を連結するSQL - 解決編

教えてえらい人:複数行を連結するSQL より

この本読んでたら、まさにそれに近いスクリプトが載っていたので、今回のケースに合わせてアレンジしたものを記載しておきます。本を持っている人は

SQLクックブック ―データベースエキスパートのための実践レシピ集

SQLクックブック ―データベースエキスパートのための実践レシピ集

の 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 を仕事で使う人は、読んでおいて決して損のない本だと思います(…ちょっと高いけど)。