Отключить таблицу и вычислить поле
У меня плохая схема, и мне нужно отключить некоторые поля, а также рассчитать дату. Вот что у меня есть:
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