Отключить таблицу и вычислить поле

У меня плохая схема, и мне нужно отключить некоторые поля, а также рассчитать дату. Вот что у меня есть:

DATE1       DATE7       H1  H2  H3  H4  H5  H6  H7
2011-09-19  2011-09-25  3   5   2   7   8   0   0
2011-09-26  2011-10-02  8   6   4   2   1   0   0
2011-10-03  2011-10-09  7   9   5   3   6   0   0

H1 - количество часов, проведенных в понедельник. H2 для вторника и так далее. H7 - воскресенье.

Date1 содержит полную дату в понедельник, а Date7 - в воскресенье. Это проблема, потому что мне нужна одна дата и одно количество часов на строку.

Это то, что мне нужно:

DATE        HOUR
2011-09-19  3
2011-09-20  5
2011-09-21  2
2011-09-22  7
2011-09-23  8
2011-09-24  0
2011-09-25  0
2011-09-26  8
2011-09-27  6
2011-09-28  4
2011-09-29  2
2011-09-30  1
....

С UNPIVOT, разворачивание H1 к H7 сработало, но я не мог понять, как решить поле DATE.

Вот SQLFiddle для этого случая: http://sqlfiddle.com/

Спасибо заранее!

2 ответа

Решение

Небольшое извлечение строки из имен столбцов делает свое дело:

SELECT      DATEADD(DAY, CAST(RIGHT([WeekDay],1) AS int) - 1, Date1) As [Date],
            [Hour]
FROM        MyTable
UNPIVOT     (
                [Hour] FOR [WeekDay] IN (H1,H2,H3,H4,H5,H6,H7)
            ) upvt

Если вы знаете, что Date1 и Date2 представляют интервалы в одну неделю, вы можете сделать это следующим образом:

DECLARE @t TABLE
    (
      dt DATE ,
      H1 INT ,
      H2 INT ,
      H3 INT ,
      H4 INT ,
      H5 INT ,
      H6 INT ,
      H7 INT
    )
INSERT  INTO @t
VALUES  ( '2011-09-19', 3, 5, 2, 7, 8, 0, 0 ),
        ( '2011-09-26', 8, 6, 4, 2, 1, 0, 0 ),
        ( '2011-10-03', 7, 9, 5, 3, 6, 0, 0 )

SELECT  DATEADD(dd, -1 + ROW_NUMBER() OVER ( PARTITION BY dt ORDER BY Day ), dt) As Date,
        SomeValue ,
        Day
FROM    @t UNPIVOT( someValue FOR Day IN ( H1, H2, H3, H4, H5, H6, H7 ) ) AS U;

Выход:

Date        SomeValue   Day
2011-09-19  3           H1
2011-09-20  5           H2
2011-09-21  2           H3
2011-09-22  7           H4
2011-09-23  8           H5
2011-09-24  0           H6
2011-09-25  0           H7
2011-09-26  8           H1
2011-09-27  6           H2
2011-09-28  4           H3
2011-09-29  2           H4
2011-09-30  1           H5
2011-10-01  0           H6
2011-10-02  0           H7
2011-10-03  7           H1
2011-10-04  9           H2
2011-10-05  5           H3
2011-10-06  3           H4
2011-10-07  6           H5
2011-10-08  0           H6
2011-10-09  0           H7
Другие вопросы по тегам