2013-08-22 3 views
0

У меня есть следующая проблема: мне нужно реализовать календарь с помощью SQL Server 2005. Вот пример того, что моя хранимая процедура дает мне до сих пор:Использование PIVOT на календаре в 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 

Я знаю о функции PIVOT в SQL Server, который, кажется, чтобы быть полезным для этих случаев, и я искал примеры и объяснения, но я до сих пор не понимаю, полностью. Кроме того, до сих пор я видел только такие примеры, как получение общей суммы продаж в месяц; Я не уверен, что мой календарь может использовать ту же логику (или даже если я могу делать то, что я намерен делать с помощью PIVOT). В любом случае, может кто-нибудь указать мне в правильном направлении о моей проблеме? Заранее спасибо.

ответ

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

Но если у вас есть неизвестное число значений, то вы можете использовать динамический 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 | 
Смежные вопросы