PIVOT<を実行しようとしています。 / code>
データ。 SQLサーバーにはPIVOT
があります これを実行できる関数。 PIVOT
を実行するには 使用する集計関数を決定する必要があります。私のサンプルでは、 MAX()
を使用しました ただし、 SUM()
を使用できます 、など。
ピボット関数がない場合は、 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 Fiddle withDemo を参照してください。
静的PIVOTバージョン: 名前の値をこのクエリにハードコーディングします
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
SQL Fiddle withDemo を参照してください。
上記のバージョンは、列の数がわかっている場合にうまく機能しますが、 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 Fiddle withDemo を参照してください。
3つのバージョンすべてで同じ結果が得られます:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |