SQL QUERY用另一个值替换行中的NULL值

时间:2013-09-13 13:43:37

标签: sql sql-server sql-server-2008-r2 null

以下是我的例子:


CREATE TABLE test1(Account varchar(50), FiscalPeriod int, OpenBalance decimal(18,3),debitamt decimal(18,3), company varchar(10), SegValue1 int);

INSERT INTO test1 VALUES('10-1155-000-', 0,1000000,0,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 1,0,45000,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 2,0,250,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 3,0,60000,'EII',1155);
INSERT INTO test1 VALUES('10-1156-000-', 0,55000,0,'EII',1156);
INSERT INTO test1 VALUES('10-1156-000-', 1,0,850,'EII',1156);
INSERT INTO test1 VALUES(NULL, 2,NULL,NULL,NULL,NULL);
INSERT INTO test1 VALUES('10-1156-000-', 3,0,4000,'EII',1156);
INSERT INTO test1 VALUES('10-1157-000-', 0,150000,0,'EII',1157);
INSERT INTO test1 VALUES(NULL, 1,NULL,NULL,NULL,NULL);
INSERT INTO test1 VALUES('10-1157-000-', 2,0,6000,'EII',1157);
INSERT INTO test1 VALUES('10-1157-000-', 3,0,100,'EII',1157);

SELECT  * FROM  test1

上表是查询数据库时我的CTE的示例。在这个基本查询中,我通过使用月份控制(日期控制)表添加了缺少FiscalPeriod的位置。这样做显然会创建具有空值的行。

我想要做的是将“Account”,“Company”和“SegValue1”列中的NULL替换为每个帐户包含FiscalPeriod等于“0”的行中的值。
例如,帐户“10-1156-000-”缺少财务期间为“2”的行。使用monthControl表添加行时,除了financialperiod列之外的所有列都包含Null。 “帐户”,“公司”和“SegValue1”列应包含sam值,该值位于财务期间为“0”的行中,并且帐户等于“10-1156-000-”。 在帐户“10-1157-000-”中,它缺少财政期间“1”。该行中的空值需要填充来自行的数据,其中财务周期为“0”且帐户等于“10-1157-000 - ”。

查询可能会有任意数量的帐户,并且任何数量的这些帐户都可能缺少需要添加和填写的财务周期或多个财务周期。

提前感谢您的帮助!

以下是针对此特定情况的所需输出示例:

CREATE TABLE test1(Account varchar(50), FiscalPeriod int, OpenBalance decimal(18,3),debitamt decimal(18,3), company varchar(10), SegValue1 int);

INSERT INTO test1 VALUES('10-1155-000-', 0,1000000,0,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 1,0,45000,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 2,0,250,'EII',1155);
INSERT INTO test1 VALUES('10-1155-000-', 3,0,60000,'EII',1155);
INSERT INTO test1 VALUES('10-1156-000-', 0,55000,0,'EII',1156);
INSERT INTO test1 VALUES('10-1156-000-', 1,0,850,'EII',1156);
INSERT INTO test1 VALUES('10-1156-000-', 2,0,0,'EII',1156);
INSERT INTO test1 VALUES('10-1156-000-', 3,0,4000,'EII',1156);
INSERT INTO test1 VALUES('10-1157-000-', 0,150000,0,'EII',1157);
INSERT INTO test1 VALUES('10-1157-000-', 1,0,0,'EII',1157);
INSERT INTO test1 VALUES('10-1157-000-', 2,0,6000,'EII',1157);
INSERT INTO test1 VALUES('10-1157-000-', 3,0,100,'EII',1157);

SELECT  * FROM  test1

2 个答案:

答案 0 :(得分:0)

以下是CompanySegValue1的一种方式:

update t
    set Company = coalesce(t.Company, newvals.Company),
        SegValue1 = coalesce(t.SegValue1, newvals.SegValue1)
    from test1 t join
         (select *
          from test1
          where FiscalPeriod = 0
         ) newvals
         on t.account = newvals.account
    where t.Company is NULL or t.SegValue1 is NULL;

您不能对Account使用相同的方法,因为无法匹配新值。

答案 1 :(得分:0)

我认为你最好删除NULL行,然后插入“缺失”行,如下所示:

delete test1 where Account is null;

with FiscalPeriods(n) as (
    select 1 union all select 2 union all select 3
), newrows as (
    select Account,n,OpenBalance,debitamt,company,SegValue1
    from test1 t
    cross join FiscalPeriods f
    where t.FiscalPeriod=0 and not exists(select * from test1 x where x.Account=t.Account and x.FiscalPeriod=n)
)
insert test1
select * from newrows;