Sql server 2005 在SQLServer2005中使用日历透视

Sql server 2005 在SQLServer2005中使用日历透视,sql-server-2005,pivot,Sql Server 2005,Pivot,我有以下问题:我需要使用SQLServer2005实现日历。以下是我的存储过程到目前为止提供给我的一个示例: TIME | DATE | CALENDAR_ID | SUBJECT | NOTES | STATUS_ID =================================================================== 09:00 | 19/08/2013 | 1 | SUBJECT 1 | NOTES 1 | 1

我有以下问题:我需要使用SQLServer2005实现日历。以下是我的存储过程到目前为止提供给我的一个示例:

TIME  |    DATE    |  CALENDAR_ID |  SUBJECT  |  NOTES  | STATUS_ID
===================================================================
09:00 | 19/08/2013 | 1            | SUBJECT 1 | NOTES 1 | 1
10:00 | 19/08/2013 | 2            | SUBJECT 2 | NOTES 2 | 2
11:00 | 19/08/2013 | 3            | SUBJECT 3 | NOTES 3 | 3
12:00 | 19/08/2013 | 4            | SUBJECT 4 | NOTES 4 | 1
09:00 | 20/08/2013 | 5            | SUBJECT 5 | NOTES 5 | 4
10:00 | 20/08/2013 | 6            | SUBJECT 6 | NOTES 6 | 3
11:00 | 20/08/2013 | 7            | SUBJECT 7 | NOTES 7 | 1
12:00 | 20/08/2013 | 8            | SUBJECT 8 | NOTES 8 | 1
但我想这样展示:

TIME  | 19/08/2013 | 20/08/2013
===============================
09:00 | SUBJECT 1  | SUBJECT 5
10:00 | SUBJECT 2  | SUBJECT 6
11:00 | SUBJECT 3  | SUBJECT 7
12:00 | SUBJECT 4  | SUBJECT 8

我知道SQL Server中的PIVOT函数似乎对这些情况很有用,我搜索了一些示例和解释,但我仍然不完全理解。除此之外,到目前为止,我只看到过这样的例子,比如每月销售总额;我不确定我的日历是否可以使用相同的逻辑(或者即使我可以使用PIVOT完成我打算做的事情)。不管怎样,有人能给我指出我的问题的正确方向吗?提前感谢。

是的,您可以使用PIVOT函数将数据行转换为列。您只需使用聚合函数
max
min
为每个日期选择
主题。如果要转换为列的日期数量有限,则可以硬编码查询:

select [time], [19/08/2013], [20/08/2013]
from
(
  select [time], [date], subject
  from yourtable
) d
pivot
(
  max(subject)
  for [date] in ([19/08/2013], [20/08/2013])
) piv;

但如果值的数目未知,则可以在存储过程中使用动态SQL来获得结果:

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

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

set @query = 'SELECT [time], ' + @cols + ' 
            from 
            (
              select [time], [date], subject
              from yourtable
            ) x
            pivot 
            (
                max(subject)
                for [date] in (' + @cols + ')
            ) p '

execute sp_executesql @query;
看。两者都将产生一个结果:

|  TIME | 19/08/2013 | 20/08/2013 |
-----------------------------------
| 09:00 |  SUBJECT 1 |  SUBJECT 5 |
| 10:00 |  SUBJECT 2 |  SUBJECT 6 |
| 11:00 |  SUBJECT 3 |  SUBJECT 7 |
| 12:00 |  SUBJECT 4 |  SUBJECT 8 |