1

SQL Server 2005には、以下に示す結果を取得する次のクエリがあります。

select Distinct(date),id,
           sum(convert(float,Gross)),
           count(*) as no from Daily
    group by date,id 
    order by date desc

Date                     id          Gross          Count
2012-11-25 00:00:00.000  Client id1  1232.6140752   12
2012-11-25 00:00:00.000  Client id2  1183.75621528  88
2012-11-26 00:00:00.000  Client id3  4561.459086    67
2012-11-26 00:00:00.000  Client id4  6781.15660608  440

次の形式で結果を取得するにはどうすればよいですか。これはピボットクエリが必要なようです助けてください

id           Date1  Date2  Date3  Date4  Date5 Date6 Date7
Client id1   Gross       
Client id2   Gross
Client id3   Gross
4

2 に答える 2

2

PIVOTすべての日付値をハードコーディングする静的バージョンと、実行時に日付のリストを生成する動的バージョンの2つの方法があります。

静的バージョン:

日付の数が限られている場合、クエリはこれに似ています。

select id, [yourDate1], [yourDate2], [yourDate3]
from
(
  select date, id, cast(gross as float) as gross
  from Daily
) src
pivot
(
  sum(gross)
  for date in ([yourDate1], [yourDate2], [yourDate3])
) piv;

SQL FiddlewithDemoを参照してください

動的バージョン:

このバージョンは、実行時に日付のリストを取得するための動的SQLを生成します。コードは次のようになります。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(date) 
                    from Daily
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from 
             (
               select date, id, cast(gross as float) as gross
               from Daily
            ) src
            pivot 
            (
                sum(gross)
                for date in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

于 2012-11-26T11:43:58.797 に答える
0
WITH a AS
(
    SELECT [Id], [Gross]
    , [DateRank] = DENSE_RANK() OVER (ORDER BY [Date])
    FROM [Daily]
)
SELECT *
FROM a PIVOT
(
    SUM([Gross])
    FOR [DateRank] IN ([1], [2], [3], [4], [5], [6], [7])
) b
于 2012-11-26T11:43:46.037 に答える