【问题标题】:pivot and cascade null columns枢轴和级联空列
【发布时间】:2013-01-28 01:53:34
【问题描述】:

我有一个表格,其中包含特定月份的值:

|制造商 |日期 |因素 | ----------------------------------------- | 1 | 2013-01-01 | 1 | | 2 | 2013-01-01 | 0.8 | | 2 | 2013-02-01 | 1 | | 2 | 2013-12-01 | 1.55 | | 3 | 2013-01-01 | 1 | | 3 | 2013-04-01 | 1.3 | | 3 | 2013-05-01 | 1.2 | | 3 | 2013-06-01 | 1.1 | | 3 | 2013-07-01 | 1 | | 4 | 2013-01-01 | 0.9 | | 4 | 2013-02-01 | 1 | | 4 | 2013-12-01 | 1.8 | | 5 | 2013-01-01 | 1.4 | | 5 | 2013-02-01 | 1 | | 5 | 2013-10-01 | 1.3 | | 5 | 2013-11-01 | 1.2 | | 5 | 2013-12-01 | 1.5 |

我想要做的是使用calendar 表(已定义)旋转这些:

最后,级联NULL 列以使用之前的值。

到目前为止,我得到的是一个查询,它将用mfg = 3 的最后一个值填充NULLs。每个 mfg 将始终具有一年中第一年的值。我的问题是;我如何旋转它并扩展到所有mfg

SELECT c.[date], 
       f.[factor], 
       Isnull(f.[factor], (SELECT TOP 1 factor 
                           FROM   factors 
                           WHERE  [date] < c.[date] 
                                  AND [factor] IS NOT NULL 
                                  AND mfg = 3 
                           ORDER  BY [date] DESC)) AS xFactor 
FROM   (SELECT [date] 
        FROM   calendar 
        WHERE  Datepart(yy, [date]) = 2013 
               AND Datepart(d, [date]) = 1) c 
       LEFT JOIN (SELECT [date], 
                         [factor] 
                  FROM   factors 
                  WHERE  mfg = 3) f 
              ON f.[date] = c.[date] 

结果

|日期 |因素 | XFACTOR | --------------------------------- | 2013-01-01 | 1 | 1 | | 2013-02-01 | (空) | 1 | | 2013-03-01 | (空) | 1 | | 2013-04-01 | 1.3 | 1.3 | | 2013-05-01 | 1.2 | 1.2 | | 2013-06-01 | 1.1 | 1.1 | | 2013-07-01 | 1 | 1 | | 2013-08-01 | (空) | 1 | | 2013-09-01 | (空) | 1 | | 2013-10-01 | (空) | 1 | | 2013-11-01 | (空) | 1 | | 2013-12-01 | (空) | 1 |

SQL Fiddle

【问题讨论】:

    标签: sql-server sql-server-2008 pivot


    【解决方案1】:

    不知道您是否需要日历表中的动态日期,或者mfg 是否可以超过 5 个,但这应该会给您一些想法。

    select *
    from (
          select c.date,
                 t.mfg,
                 (
                 select top 1 f.factor 
                 from factors as f
                 where f.date <= c.date and
                       f.mfg = t.mfg and
                       f.factor is not null
                 order by f.date desc
                 ) as factor      
          from calendar as c
            cross apply(values(1),(2),(3),(4),(5)) as t(mfg)
         ) as t
    pivot (
          max(t.factor) for t.date in ([20130101], [20130201], [20130301], 
                                       [20130401], [20130501], [20130601], 
                                       [20130701], [20130801], [20130901], 
                                       [20131001], [20131101], [20131201])
          ) as P
    

    SQL Fiddle

    【讨论】:

    • +1 我的工作让我分心,没有完成我的关键答案。
    • +1 抱歉,接受了一段时间。我一直在玩它以更好地了解它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多