逆透视 table 并计算字段
Unpivot table and calculate field
我的架构不好,需要取消透视某些字段并计算日期。
这是我拥有的:
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
提前致谢!
从列名中提取一点字符串就可以了:
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
我的架构不好,需要取消透视某些字段并计算日期。 这是我拥有的:
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
提前致谢!
从列名中提取一点字符串就可以了:
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