あなたはPIVOT
データをしようとしています。SQL Serverには、PIVOT
これを実行できる機能があります。を実行するには、PIVOT
使用する集計関数を決定する必要があります。私のサンプルでは、使用しましたが、などMAX()
を使用できます。SUM()
ピボット関数がない場合は、CASE
ステートメントで集計関数を使用してこれを行うことができます。
Aggregate / CASEバージョン:このバージョンでは、すべての名前を列にハードコーディングする必要があります。
select
max(case when name = 'Engineering' then rating end) Engineering,
max(case when name = 'Financials' then rating end) Financials,
max(case when name = 'Scope' then rating end) Scope,
max(case when name = 'Schedule' then rating end) Schedule,
max(case when name = 'Risks' then rating end) Risks,
max(case when name = 'People' then rating end) People
from yourtable
SQL FiddlewithDemoを参照してください
静的PIVOTバージョン:名前の値をこのクエリにハードコーディングします
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
SQL FiddlewithDemoを参照してください
上記のバージョンは、列の数がわかっている場合はうまく機能しますが、name
値が不明な場合は、データに動的SQLを使用できますPIVOT
。
動的PIVOTバージョン:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select name, rating
from yourtable
) x
pivot
(
max(rating)
for name in (' + @cols + ')
) p '
execute(@query)
SQL FiddlewithDemoを参照してください
3つのバージョンすべてで同じ結果が得られます。
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |