このデータを変換する方法はいくつかあります。元の投稿では、このシナリオには複雑すぎるように思われると述べましたが、SQLServerのとPIVOT
関数の両方を使用して非常に簡単に適用できます。UNPIVOT
PIVOT
ただし、これらの関数にアクセスできない場合は、 toを使用して複製し、次に次のステートメントを使用UNION ALL
しUNPIVOT
て集約関数を複製できます。CASE
PIVOT
テーブルの作成:
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
Union All、AggregateおよびCASEバージョン:
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
SQL FiddlewithDemoを参照してください
は、列を個別の行に変換することにより、データのUNION ALL
を実行します。次に、ステートメントを使用して集計関数を適用し、各の新しい列を取得します。UNPIVOT
Paul, John, Tim, Eric
sum()
case
color
UnpivotおよびPivotStaticバージョン:
UNPIVOT
SQL Serverのと関数の両方により、PIVOT
この変換がはるかに簡単になります。変換する値がすべてわかっている場合は、それらを静的バージョンにハードコーディングして、次の結果を得ることができます。
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
SQL FiddlewithDemoを参照してください
を使用した内部クエリUNPIVOT
は、と同じ機能を実行しますUNION ALL
。列のリストを取得して行にPIVOT
変換し、最後に列への変換を実行します。
動的ピボットバージョン:
不明な数の列(このPaul, John, Tim, Eric
例では)があり、変換する色の数が不明な場合は、動的SQLを使用してリストを生成してUNPIVOT
からPIVOT
:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
SQL FiddlewithDemoを参照してください
yourtable
動的バージョンは、両方とsys.columns
テーブルをクエリして、UNPIVOT
とへのアイテムのリストを生成しPIVOT
ます。次に、これが実行されるクエリ文字列に追加されます。動的バージョンの利点は、変更リストがある場合、colors
および/またはnames
これにより実行時にリストが生成される場合です。
3つのクエリはすべて、同じ結果を生成します。
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |