逆透视 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