首页 > 解决方案 > 用以前的非空值填充缺失的数据 - 但仅限于简单的 SQL

问题描述

我有一个值表,需要用之前的非空值填写空白。

Store  SKU  YearNo  MonthNo  StockQty
001   010C   2018    6       34
001   010C   2018    7       NULL
001   010C   2018    8       NULL
001   010C   2018    9       46
002   010C   2018    6       15
002   010C   2018    7       14
002   010C   2018    8       NULL
002   010C   2018    9       NULL

在上面的例子中,我想用之前的非空值填充空值,所以在 SKU 010C 的存储 001 处,第 7 个月应该变成 34,第 8 个月应该是 34;在 SKU 010C 的商店 001 中,第 8 个月和第 9 个月应变为 14。

好的,有很多关于如何使用精美的 APPLY 和 CTE 以及语句等来执行此操作的帖子。但美中不足的是……

我必须仅使用拖放 ETL 工具功能来执行此操作。这意味着我可以选择字段,我可以应用简单的公式(例如,当 Stock 为 null 然后为 0 时的 CASE),我可以从下拉列表中选择连接(INNER、LEFT OUTER、RIGHT OUTER)。我不能手写自定义子选择、分区、withs、创建临时表或任何比 SQL 课程第一周更高级的东西。想想 MS Access 拖放查询生成器之类的东西。

我怎样才能做到这一点?任何人?

标签: sql-server

解决方案


好吧,您可以自加入您的表 N 次并使用coalesceorisnullcase。他们都会得到你想要的。您需要知道有多少连续NULL列来说明所有可能性。

declare @table table (store varchar(3), sku varchar(4), YearNo int, MonthNo int, StockQty int null)
insert into @table
values
('001','010C',2018,6,34),
('001','010C',2018,7,NULL),
('001','010C',2018,8,NULL),
('001','010C',2018,9,46),

('002','010C',2018,6,15),
('002','010C',2018,7,14),
('002','010C',2018,8,NULL),
('002','010C',2018,9,NULL)

select distinct
    t1.store
    ,t1.sku
    ,t1.YearNo
    ,t1.MonthNo
    ,coalesce(t1.StockQty,t2.StockQty,t3.StockQty)
from
    @table t1
    left join @table t2 on
            t2.store = t1.store 
        and t2.YearNo = t1.YearNo 
        and t2.MonthNo = t1.MonthNo -1 
    left join @table t3 on
            t3.store = t1.store 
        and t3.YearNo = t1.YearNo 
        and t3.MonthNo = t1.MonthNo - 2  

或者,作为更新声明...

update t1    
    set StockQty = coalesce(t1.StockQty,t2.StockQty,t3.StockQty)
from
    @table t1
    left join @table t2 on
            t2.store = t1.store 
        and t2.YearNo = t1.YearNo 
        and t2.MonthNo = t1.MonthNo -1 
    left join @table t3 on
            t3.store = t1.store 
        and t3.YearNo = t1.YearNo 
        and t3.MonthNo = t1.MonthNo - 2  

select * from @table

推荐阅读