0

我有以下问题:我需要使用 SQL Server 2005 实现日历。这是我的存储过程到目前为止给我的示例:

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 做我打算做的事情)。无论如何,有人能指出我的问题的正确方向吗?提前致谢。

4

1 回答 1

2

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

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 Fiddle

但是,如果您有未知数量的值,那么您可以在存储过程中使用动态 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;

请参阅SQL Fiddle with Demo。两者都会给出结果:

|  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 |
于 2013-08-22T17:00:01.380 回答