2012-11-26 188 views
1

我在SQL Server 2005中获取下面提到的结果。枢轴查询 - 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 

现在我如何得到以下格式的结果。这看起来像一个支点查询REQD请帮助

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

你想要说'Date1','Date2'还是应该列有日期值的列? – Taryn

+0

日期值...一个月中的所有日子都会出现在表格中...所以我们每天都有总计 – Gallop

回答

2

有两种方法可以PIVOT,无论是静态的版本,你硬编码的所有日期值或动态的版本,这将产生运行时的日期列表。

静态版本:

如果你有日期的数量有限,您的查询会与此类似。

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来获得在运行时的日期列表。您的代码将与此类似:

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 Fiddle with Demo

+0

+1我太慢了:) –

+0

Msg 8117,Level 16,State 1,Line 1 对于sum运算符,操作数数据类型varchar无效。 使用动态查询时。 – Gallop

+0

@Moonwalk如果你的'gross'字段是'varchar',那么你需要在内部查询中执行'convert'。查看我的编辑 – Taryn

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