【问题标题】:Unpivot table and calculate field反透视表和计算字段
【发布时间】:2015-03-27 15:36:22
【问题描述】:

我的架构不好,需要取消透视某些字段并计算日期。 这是我所拥有的:

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

提前感谢!

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 如果列名是 A、B、C 怎么办?
    • 他们在问题中不是 A B 或 C。我不做任何假设,我使用提供的东西。
    • 工作就像一个魅力!非常感谢 Zoff!
    【解决方案2】:

    如果你知道 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多