我的架构很糟糕,需要取消某些字段的显示并计算日期。 这就是我所拥有的:
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/#!3/4e012/2/0
先谢谢!
答案 0 :(得分:1)
从列名中提取一点字符串可以解决问题:
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
答案 1 :(得分:1)
如果你知道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