2015-10-22 114 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。 。 。我不確定這個問題來自哪裏。幾個月不是計算的一部分。只要以前有價值的日子,這就會奏效。 –