2015-10-22 41 views
1

我在做一个PIVOT命令。我的行标签是日期字段。我的列是[NY],[TX]等位置。源数据中的某些值为空,但是一旦它被旋转,我想用日期顺序中的最后一个已知值“填充”这些空值。旋转时填充值“向下”

这就是如果列NY的值为2010年1月1日,但为2010年1月1日为空我想填写从2010年1月1日到2010年1月2日的值,以及任何其他空值日期如下,直到另一个值已经存在。所以基本上我用填充每个列的数据的关闭日期的相同数据来填补空缺。

我的枢查询我公司目前拥有的一个例子是:

SELECT ReadingDate, [NY],[TX],[WI] 
FROM 
    (SELECT NAME As 'NodeName', 
      CAST(FORMAT(readingdate, 'M/d/yyyy') as Date) As 'ReadingDate', 
      SUM(myvalue) As 'Value' 
    FROM MyTable) as SourceData 
PIVOT (SUM(Value) FOR NodeName IN ([NY],[TX],[WI])) as PivotTable 
Order BY ReadingDate 

但我不知道如何做到这一点“补降”,以填补空值

示例源数据

1/1/2010, TX, 1 
1/1/2010, NY, 5 
1/2/2010, NY null 
1/1/2010, WI, 3 
1/3/2010, WI, 7 
... 

请注意,如果1/3没有WI,那么1/2或NY会导致数据透视结果为空。还有一个空记录也导致null。对于纽约一旦枢轴1/2需要填写5,因为它是最后一个已知的价值,但1/3也需要归档与5一旦旋转,因为该记录甚至不存在,但当旋转它会显示作为空值,因为它不存在,但另一个位置有记录。

+0

您可以为MyTable的基本架构? –

+0

NAME是varchar,readingdate是varchar,myvalue是数字 – user441521

+0

您使用的是哪个版本的SQL Server?而且,你能提供一个源数据的例子吗? –

回答

1

这可能是SQL Server的一种痛苦。 ANSI支持LAG()上的一个很好的功能,名为IGNORE NULL,但SQL Server尚不支持它。我将与使用条件聚合(个人喜好)开始:

select cast(readingdate as date) as readingdate,, 
     sum(case when name = 'NY' then value end) as NY, 
     sum(case when name = 'TX' then value end) as TX, 
     sum(case when name = 'WI' then value end) as WI 
from mytable 
group by cast(readingdate as date); 

因此,我们必须更聪明一点。我们可以根据它们之前的非NULL值的数量将NULL值分配到组中。幸运的是,使用累积式COUNT()函数很容易。然后,我们可以通过使用MAX()(或MIN())获得该组中的一个非NULL值:

with t as (
     select cast(readingdate as date) as readingdate, 
      sum(case when name = 'NY' then value end) as NY, 
      sum(case when name = 'TX' then value end) as TX, 
      sum(case when name = 'WI' then value end) as WI, 
     from mytable 
     group by cast(readingdate as date) 
    ), 
    t2 as (
     select t.*, 
      count(NY) over (order by readingdate) as NYgrp, 
      count(TX) over (order by readingdate) as TXgrp, 
      count(WI) over (order by readingdate) as WIgrp 
     from t 
    ) 
select readingdate, 
     coalesce(NY, max(NY) over (partition by NYgrp)) as NY, 
     coalesce(TX, max(TX) over (partition by TXgrp)) as TX, 
     coalesce(WI, max(WI) over (partition by WIgrp)) as WI 
from t2; 
+0

哇,我得玩一秒才能掌握它:) – user441521

+0

如果整个月没有数据的话,这项工作是否会奏效......? – Shnugo

+0

@Shnugo。 。 。我不确定这个问题来自哪里。几个月不是计算的一部分。只要以前有价值的日子,这就会奏效。 –