-3

私は次の表を持っています:

Name           Rating
Engineering    1
Financials     3
Scope          1
Schedule       2
Risks          3
People         3

次のように出力したいと思います。

Engineering  Financials  Scope  Schedule  Risks  People
1            3           1      2         3      3

SQLクエリのみを使用します。誰かが正しい出力を取得するのを手伝ってもらえますか?

4

1 に答える 1

3

あなたは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 |
于 2012-12-06T13:35:52.120 に答える