2016-12-07 8 views
1

結果セットから行を取り込んで、それらの行を新しい表の列に変換することはできますか? 1つの行のデータに変換されるので、新しいテーブルにはアイテム3の行が1つ、アイテム4の行が1つしかありませんが、新しいアイテム3が結果に見つかると、新しいテーブルの行。結果内の別々のブロックに基づいてSQL行を列に変換する

私はSQL Server 2012 Expressを使用しています。 Start DateEnd DateItemdatetimeありvarchar(256)でありCodevarchar(256)ある:

サンプルデータ:

 
Start Date   End Date    Item Code 
*2010-01-01 04:30:00  2010-01-01 04:33:35 3  1 
*2010-01-01 04:33:36  2010-01-01 04:37:11 3  3 
*2010-01-01 04:37:12  2010-01-01 04:40:47 3  4 
2010-01-01 06:43:12  2010-01-01 06:46:47 4  2 
2010-01-01 06:46:48  2010-01-01 06:50:23 4  3 
2010-01-01 08:56:24  2010-01-01 08:59:59 5  2 
2010-01-01 09:00:00  2010-01-01 09:03:35 5  3 
2010-01-01 11:09:36  2010-01-01 11:13:11 6  2 
2010-01-01 11:13:12  2010-01-01 11:16:47 6  4 
*2010-01-01 14:30:00  2010-01-01 14:33:35 3  1 
*2010-01-01 14:33:36  2010-01-01 14:37:11 3  2 
*2010-01-01 14:37:12  2010-01-01 14:40:47 3  4 

出力データ(列があった何コードがヌルでないであろうがある。上記手段は、開始日付を使用入力行セットごとの時間):

 
Item C1_Start C1_End C2_Start C2_End C3_Start C3_End C4_Start C4_End 
*3  above  above null  null above  above above  above 
4  null  null above  above above  above null  null 
5  null  null above  above above  above null  null 
6  null  null above  above null  null above  above 
*3  above  above above  above null  null above  above 

ありがとう

+1

はわずか4 'Code'sありますか? –

+0

いいえ、フェリックス。コードの範囲は0から9までです。 – beliskna

答えて

2

ただ、条件付き集約を使用します。

select item, 
     max(case when code = 1 then startdate end) as c1_start, 
     max(case when code = 1 then enddate end) as c1_end, 
     max(case when code = 2 then startdate end) as c2_start, 
     max(case when code = 2 then enddate end) as c2_end, 
     max(case when code = 3 then startdate end) as c2_start, 
     max(case when code = 3 then enddate end) as c3_end, 
     max(case when code = 4 then startdate end) as c4_start, 
     max(case when code = 4 then enddate end) as c4_end 
from t 
group by item; 
+0

ありがとうゴードン、私は同様の行に沿って作業していましたが、パズルの最後の部分を取得できませんでした。私は私のポイントを説明するために質問を甘やかす。 – beliskna

関連する問題