none
SQL:複数行を1レコードにしたい RRS feed

  • 質問

  • いつもお世話になっております。
    ■受注テーブル
    受注No    商品区分    商品番号
    ---------------------------------
    00001     001         A10001
    00001     002         B10001
    00001     003         C10001
    00001     004         D10001
    00001     005         E10001
    00002     001         F10001
    00002     003         G10001
    00002     005         H10001
    00003     002         I10001
    00003     004         J10001
    受注テーブルを下記のように出力したいのですが、どのようにSQLを書いたら良いでしょうか?
            |   001       002       003      004      005
    ----------------------------------------------
    00001 | A10001  B10001  C10001  D10001  E10001
    00002 | F10001             G10001             H10001
    00003 |            I10001              J10001
    宜しくお願い致します。

    • 編集済み hana0101 2012年1月27日 4:11
    2012年1月27日 4:10

回答

  • 真面目につないでいけばクエリーは書けると思いますが。

     

    SELECT A.受注No, [001].商品番号 AS [001], [002].商品番号 AS [002], [003].商品番号 AS [003], [004].商品番号 AS [004], [005].商品番号 AS [005]
    FROM (SELECT DISTINCT 受注No FROM 受注テーブル) AS A
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='001') AS [001] ON A.受注No=[001].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='002') AS [002] ON A.受注No=[002].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='003') AS [003] ON A.受注No=[003].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='004') AS [004] ON A.受注No=[004].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='005') AS [005] ON A.受注No=[005].受注No;
    
    

     


    とはいえPIVOTという機能がSQL Serverにあり、これを使うと

     

    SELECT 受注No, [001], [002], [003], [004], [005]
    FROM 受注テーブル
    PIVOT (
        MIN(商品番号)
        FOR 商品区分 IN ([001], [002], [003], [004], [005])
    ) AS P;
    
    

    こう書けます。

     


    • 編集済み 佐祐理 2012年1月27日 5:06
    • 回答としてマーク hana0101 2012年1月30日 6:47
    2012年1月27日 5:06
  • 商品区分が動的に変動するのであれば、以下を参考にしてみて下さい。

    列・行ともに動的なマトリックスレポートについて
    http://social.msdn.microsoft.com/forums/ja-JP/vwdexpressja/thread/cc11ec46-e3ed-4459-bb58-b56f4ebdf45b/

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク hana0101 2012年1月30日 6:47
    2012年1月27日 6:16

すべての返信

  • 真面目につないでいけばクエリーは書けると思いますが。

     

    SELECT A.受注No, [001].商品番号 AS [001], [002].商品番号 AS [002], [003].商品番号 AS [003], [004].商品番号 AS [004], [005].商品番号 AS [005]
    FROM (SELECT DISTINCT 受注No FROM 受注テーブル) AS A
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='001') AS [001] ON A.受注No=[001].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='002') AS [002] ON A.受注No=[002].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='003') AS [003] ON A.受注No=[003].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='004') AS [004] ON A.受注No=[004].受注No
    LEFT OUTER JOIN (SELECT 受注No, 商品番号 FROM 受注テーブル WHERE 商品区分='005') AS [005] ON A.受注No=[005].受注No;
    
    

     


    とはいえPIVOTという機能がSQL Serverにあり、これを使うと

     

    SELECT 受注No, [001], [002], [003], [004], [005]
    FROM 受注テーブル
    PIVOT (
        MIN(商品番号)
        FOR 商品区分 IN ([001], [002], [003], [004], [005])
    ) AS P;
    
    

    こう書けます。

     


    • 編集済み 佐祐理 2012年1月27日 5:06
    • 回答としてマーク hana0101 2012年1月30日 6:47
    2012年1月27日 5:06
  • 商品区分が動的に変動するのであれば、以下を参考にしてみて下さい。

    列・行ともに動的なマトリックスレポートについて
    http://social.msdn.microsoft.com/forums/ja-JP/vwdexpressja/thread/cc11ec46-e3ed-4459-bb58-b56f4ebdf45b/

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク hana0101 2012年1月30日 6:47
    2012年1月27日 6:16
  • 佐祐理さん、ありがとうございます。

    教えて頂いた方法で出来ました。

     

    trapemiyaさん、ありがとうございます。

    とても参考になりました。

    2012年1月30日 6:47