Unpivot表和计算字段

时间:2015-01-28 16:23:52

标签: sql-server-2008 date calculated-columns unpivot

我的架构很糟糕,需要取消某些字段的显示并计算日期。 这就是我所拥有的:

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

先谢谢!

2 个答案:

答案 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