在具有日期或日期时间值的列上使用PIVOT

时间:2013-03-23 03:30:00

标签: sql sql-server pivot

这是我的PIVOT查询:

select * from t_interview_data
pivot (avg (widgets) for 
datestamp in ( [2009-11-01],[2009-11-02],[2009-11-03],[2009-11-04],[2009-11-05],[2009-11-06],[2009-          11-07]
,[2009-11-08],[2009-11-09],[2009-11-10],[2009-11-11],[2009-11-12],[2009-11-13],[2009-11-14],[2009-    11-15]
,[2009-11-16],[2009-11-17],[2009-11-18],[2009-11-19],[2009-11-20],[2009-11-21],[2009-11-22],[2009-11-23]
,[2009-11-24],[2009-11-25],[2009-11-26],[2009-11-27],[2009-11-28],[2009-11-29],[2009-11-30],[2009-12-01]
,[2009-12-02])) as AvgWidgetsPerDayPerEmp

我的问题是:虽然这个查询有效,但是有更简单,更简单,更优雅的方式来编写吗?

示例输出:

1 个答案:

答案 0 :(得分:1)

您可以构建查询并执行。请检查:

DECLARE @startdt DATETIME, @enddt DATETIME, @QueryCol NVARCHAR(MAX)

SET @startdt = '2009-11-01'
SET @enddt = '2009-12-02'

WHILE @startdt <= @enddt
BEGIN
    SET @QueryCol=isnull(@QueryCol, '')+QUOTENAME(convert(nvarchar(20), @startdt, 101))+(CASE WHEN @startdt<>@enddt THEN ',' ELSE '' END)
    SET @startdt =  @startdt + 1
END

if(ISNULL(@QueryCol, '')<>'')
begin
    set @QueryCol='select * from t_interview_data
                    pivot (avg (widgets) for 
                    datestamp in ('+@QueryCol+')) as AvgWidgetsPerDayPerEmp'

    exec (@QueryCol)
end