2009-05-09 104 views
1

次の列を持つ単一のテーブルからクエリを作成したいとします。SQL Server 2005で1つのテーブルからデータをピボットする方法

SEQNOがSUBJOBIDすることにより、この形式のクエリを出力すべきと日付範囲

Name ID Amount Date   JOBID  SEQNO 
Mark 9 200  1/2/09   1001   1 
Peter 3 300  1/2/09   1001   2 
Steve 1 200  2/2/09   1001   3 
Mark 9 200  3/2/09   1001   4 
Peter 3 300  4/2/09   1001   5 
Steve 1 200  5/2/09   1001   6 
Hally 1 200  5/2/09   1002   7 

ユニークキーです: -

**NAME  ID  1/2  2/2  3/2  4/2  5/2  JOBID**<br> 
Mark  9  200  NULL 200  NULL NULL  1001 
Peter  3  300  NULL NULL 300  NULL  1001 
Steve  1  NULL  200  NULL NULL 200  1001 

私はこのために、ピボットクエリの上に行くされています。しかし、私はどこにもいないようです。誰かが助けてくれますか?

答えて

2

これは実際にはPIVOT機能でかなり簡単に行うことができます。他の答えはそれを実行する方法に関連するコードを示していないので、データをPIVOTに2つの方法があります。

最初は静的ピボットです。静的なピボットは、データを事前に把握して列にすることです。

select * 
from 
(
    select name, id, convert(char(5), dt, 101) dt, jobid, amount 
    from test 
) x 
pivot 
(
    sum(amount) 
    for dt in ([01/02], [02/02], [03/02], [04/05], [05/05]) 
)p 
order by jobid, name 

SQL Fiddle with Demo

第二の方法は、列に回すために、実行時に値を識別するためにダイナミックPIVOTを使用することです参照してください。

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101)) 
        from test 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT name, id, ' + @cols + ', jobid from 
      (
       select name, id, convert(char(5), dt, 101) dt, jobid, amount 
       from test 
      ) x 
      pivot 
      (
       sum(amount) 
       for dt in (' + @cols + ') 
      ) p 
      order by jobid, name' 

execute(@query) 

は、どちらも同じ結果を生成しますSQL Fiddle with Demo

を参照してください。ダイナミックは、列に変換する前に値がわからない場合に効果的です。

関連する問題