sql-server-2008 – 从上一行中的非空值更新空列值
发布时间:2020-12-12 16:26:17 所属栏目:MsSql教程 来源:网络整理
导读:@@版本1 使用SQL Server 2008,我试图将值级联到列.我有一个包含组ID(GID)和Seq的表,其中包含组内记录的排序.对于存在的列,在本例中为Name和Salary – 我的真实表有超过50列,如果它们包含NULL,我需要使用包含非空值的该列的前一行的值更新NULL值. 这是一个可以
@@版本1
使用SQL Server 2008,我试图将值级联到列.我有一个包含组ID(GID)和Seq的表,其中包含组内记录的排序.对于存在的列,在本例中为Name和Salary – 我的真实表有超过50列,如果它们包含NULL,我需要使用包含非空值的该列的前一行的值更新NULL值. 这是一个可以说明这一点: GID Seq Name Salary 1 1 James NULL 1 2 NULL 100 1 3 NULL NULL 2 1 NULL 81 2 2 Smith NULL 2 3 NULL NULL 3 1 Charles NULL 3 2 NULL NULL 3 3 Brown NULL 3 4 NULL 75 4 0 Ron 50 4 1 NULL 20 4 2 NULL NULL 我的结果应该是: GID Seq Name Salary 1 1 James NULL 1 2 James 100 1 3 James 100 2 1 NULL 81 2 2 Smith 81 2 3 Smith 81 3 1 Charles NULL 3 2 Charles NULL 3 3 Brown NULL 3 4 Brown 75 4 0 Ron 50 4 1 Ron 20 4 2 Ron 20 我希望不使用动态SQL,循环或游标来做到这一点. 简单测试用例的代码: DECLARE @Test TABLE (GID int,Seq int,Name varchar(50),Salary decimal) INSERT INTO @Test VALUES (1,1,'James',NULL) INSERT INTO @Test VALUES (1,2,NULL,100.40) INSERT INTO @Test VALUES (1,3,NULL) INSERT INTO @Test VALUES (2,80.50) INSERT INTO @Test VALUES (2,'Smith',NULL) INSERT INTO @Test VALUES (3,'Charles','Brown',4,75) INSERT INTO @Test VALUES (4,'Ron',50) INSERT INTO @Test VALUES (4,20) INSERT INTO @Test VALUES (4,NULL) SELECT * FROM @Test @@版本2 谢谢! 解决方法这个怎么样?:;WITH CTE AS ( SELECT GID,SEQ,Name,Salary FROM @Test t1 WHERE SEQ = (SELECT MIN(SEQ) FROM @Test t2 WHERE t2.GID = t1.GID) UNION ALL SELECT t.GID,t.SEQ,COALESCE(t.Name,c.Name),COALESCE(t.Salary,c.Salary) FROM CTE c JOIN @Test t ON t.GID = c.GID AND t.SEQ = c.SEQ+1 ) UPDATE t SET Name = c.Name,Salary = c.Salary FROM @Test t JOIN CTE c ON c.GID = t.GID AND c.Seq = t.SEQ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |