SQL Server:GROUP BY与PIVOT运算符的聚合语义

时间:2010-01-21 13:21:53

标签: sql-server tsql sql-server-2008

我在SQL Server 2008上,我有一个包含以下格式的WA指标的表:

CREATE TABLE #VistitorStat
(
    datelow datetime,
    datehigh datetime,
    name varchar(255),
    cnt  int
)

表中两天的数据如下所示:

2009-07-25 00:00:00.000 2009-07-26 00:00:00.000   New Visitor       221
2009-07-25 00:00:00.000 2009-07-26 00:00:00.000   Unique Visitors   225
2009-07-25 00:00:00.000 2009-07-26 00:00:00.000   Return Visitors   0
2009-07-25 00:00:00.000 2009-07-26 00:00:00.000   Repeat Visitors   22
2009-07-26 00:00:00.000 2009-07-27 00:00:00.000   New Visitor       263
2009-07-26 00:00:00.000 2009-07-27 00:00:00.000   Unique Visitors   269
2009-07-26 00:00:00.000 2009-07-27 00:00:00.000   Return Visitors   4
2009-07-26 00:00:00.000 2009-07-27 00:00:00.000   Repeat Visitors   38

我希望按日分组,并将指标转换为行格式。我可以找到的使用PIVOT运算符的示例仅显示基于SUMMAX聚合函数的聚合。据推测,我需要向GROUP BY运算符传达PIVOT语义 - 注意:我找不到任何有关如何实现此目的的明确示例/文档。有人可以发布这个查询的正确语法 - 使用PIVOT运算符 - 。

如果使用pivot无法实现这一点 - 你能想出一种优雅的编写查询方式吗?如果不是,我只需要以换位形式生成数据。

发布回答编辑:

我得出结论,枢轴运算符不够优雅(到目前为止,我认为它是语法黑客) - 我已经通过以转置方式生成数据来解决问题。我欢迎你的评论。

1 个答案:

答案 0 :(得分:1)

我不确定你想要的结果,但这会给每天一行:

CREATE TABLE #VistitorStat
(
 datelow datetime,
 datehigh datetime,
 name varchar(255),
 cnt  int
)


insert into #VistitorStat
      select  '2009-07-25 00:00:00.000','2009-07-26 00:00:00.000',   'New Visitor',       221 
union select  '2009-07-25 00:00:00.000',' 2009-07-26 00:00:00.000',   'Unique Visitors',   225
union select  '2009-07-25 00:00:00.000',' 2009-07-26 00:00:00.000',   'Return Visitors',   0
union select  '2009-07-25 00:00:00.000',' 2009-07-26 00:00:00.000',   'Repeat Visitors',   22
union select  '2009-07-26 00:00:00.000',' 2009-07-27 00:00:00.000',   'New Visitor'    ,   263
union select  '2009-07-26 00:00:00.000',' 2009-07-27 00:00:00.000',   'Unique Visitors',   269
union select  '2009-07-26 00:00:00.000',' 2009-07-27 00:00:00.000',   'Return Visitors',   4
union select  '2009-07-26 00:00:00.000',' 2009-07-27 00:00:00.000',   'Repeat Visitors',   38


select * from #VistitorStat 
pivot (
    sum(cnt)
    for name in ([New Visitor],[Unique Visitors],[Return Visitors], [Repeat Visitors])

) p