2016-06-15 20 views
0

私は次のようにテーブルを設定しました。SQLで転記テーブル

CustomerNumber June15_Order June15_Billing July15_Order July15_Billing August15_Order August15_Billing 
    12345   5    55   3    45 
    5431   6    66   5    67 

私がすることを好むだろう:私は正確にこのテーブルを転置だろうかに関しては

CustomerNumber Date  Order Billing 
    12345  01/06/2015  5   55 
    12345  01/07/2015  3   45 
    5431  01/06/2015  6   66 
    5431  01/07/2015  5   67 

任意の考え?

答えて

4

あなただけの新しいに古いデータを取得しようとしている場合は、基本的にブルートフォースを使用する必要があります:

INSERT INTO NewTable 
    (CustomerNumber, [Date], [Order], Billing) 
    ( 
     SELECT CustomerNumber, '06/15/2015', June15_Order, June15_Billing 
     FROM OldTable 

     UNION 

     SELECT CustomerNumber, '07/15/2015', July15_Order, July15_Billing 
     FROM OldTable 

     UNION 

     SELECT CustomerNumber, '08/15/2015', August15_Order, August15_Billing 
     FROM OldTable 
    ) 
1

まず、そのあなたの後、所望の構造を持つ新しいテーブルを作成しますそのタスク用のストアドプロシージャを作成する必要があります。このストアドプロシージャはすべての行を繰り返し処理します。

old_col to new_colが知っている列では、値を変数に保存し、他の変数は "contains june"のように毎月の条件を作成し、dateとvalueの後に2つの変数を保存する必要があります値> 0の新しい月が見つかるたびに、すべての変数を含む新しいテーブルに挿入を実行するということです。

1

何ヶ月も何年もの列があるとすれば、これは本当に醜いです。列が設定され、ハードコードされている場合は、@ John Pasquetのソリューション(+1)を使用します。 MMMMDD_Typeという形式の列セットで作業する必要がある場合は、ここで概要を説明します。

最初のパス:

  • はテーブル
  • は、Dateデータ型および "タイプ"(注文、課金)
に得られた "ラベル" 列の地図変換する SELECT... UNPIVOT...クエリを書きます

しかし、結果セットのマッピング名を「July15」から「2015年7月1日」(または01/07/2015)にマッピングするのは難しくありません。これにより、第2のパスにつながる:

  • はSYS.TABLESとsys.colmns
  • から列の「検索」リストを作成の日付と種類出て、アンピボット
  • 図であることをしているものを選びますそれらの各
  • 一時テーブルに結果
  • はあなたに準備された日付と型の値を取得している(参加経由)、元の列名で検索リストにこの一時テーブルに参加投棄、動的SQLでSELECT... UNPIVOT...を構築

真剣にも、これはばかばかしく複雑になる可能性があります。スマートマネーは、日付とタイプの列を含むテーブルを再構築しています。

関連する問題