アンピボット/ピボットを使用して、必要な結果を得ることができます。結果を取得する方法はいくつかあります。値の数が限られている場合はクエリをハードコーディングできますが、値の数が不明な場合は動的 SQL を使用する必要があります。
UNPIVOT プロセスは c1
の複数の列を変換します などを複数行に。データが複数の行にある場合は、PIVOT 関数を簡単に適用できます。アンピボット関数または CROSS APPLY を使用して、複数の列からデータを変換できます:
select id, col ='Service'+Service+'_'+col+'_'+cast(seq as varchar(10)), valuefrom( select id, service, c1, cn , row_number() over (サービスごとの ID によるパーティション) seq from yourtable) tcross apply( select 'c1', c1 union all select 'cn', cn) c (col, value)
プレ>デモによる SQL Fiddle を参照してください。 .相互適用により、データが次の形式に変換されます:
<プレ>| ID |コール |値 || 1 | ServiceA_c1_1 | 5 || 1 | ServiceA_cn_1 | 3 || 1 | ServiceB_c1_2 | 2 || 1 | ServiceB_cn_2 | 1 || 2 | ServiceA_c1_1 | 9 || 2 | ServiceA_cn_1 | 4 |コード> プレ>
データがこの形式になったら、PIVOT を適用できます:
select id, ServiceA_c1_1, ServiceA_cn_1, ServiceB_c1_2, ServiceB_cn_2from( select id, col ='Service'+Service+'_'+col+'_'+cast(seq as varchar(10)), value from ( select id, service, c1, cn , row_number() over(サービスごとに ID で分割) seq from yourtable ) t cross apply ( select 'c1', c1 union all select 'cn', cn ) c (col, value)) dpivot((ServiceA_c1_1、ServiceA_cn_1、ServiceB_c1_2、ServiceB_cn_2)の列の最大(値)) piv;
プレ>デモによる SQL Fiddle を参照してください。 .
値の数が不明な場合は、上記のクエリを動的 SQL に変換できます。
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT ',' + QUOTENAME('Service'+Service+'_'+col+'_'+) cast(seq as varchar(10))) from ( select service, row_number() over(partition by id order by service) seq from yourtable )d cross apply ( select 'c1', 1 union all select 'cn', 2 ) c (col, so) group by seq, Service, col, so order by seq, so FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,' ')set @query ='SELECT id, ' + @cols + ' from ( select id, col =''Service''+Service+''_''+col+''_''+cast(seq as varchar(10) ))、値から( select id, service, c1, cn , row_number() over(partition by id order by service) seq from yourtable ) t cross apply ( select ''c1'', c1 union all select ''cn'', cn ) c (col, value) ) x pivot ( max(value) for col in (' + @cols + ') ) p 'execute sp_executesql @query;
プレ>デモによる SQL Fiddle を参照してください。 .両方とも結果が得られます:
<プレ>| ID |サービスA_C1_1 |サービスA_CN_1 |サービスB_C1_2 |サービスB_CN_2 || 1 | 5 | 3 | 2 | 1 || 2 | 9 | 4 | (ヌル) | (ヌル) |
プレ>