如何为所有行填充相同非NULL列值?SQL实现求助
解决方案:重复显示非NULL的Col4/Col5并排除Col2/Col3为NULL的行
你的表结构和测试数据如下:
create table #table1( ID int, State varchar(50), Col2 varchar(10), Col3 varchar(10), Col4 varchar(10), Col5 varchar(10) ) insert into #table1 select 1,'TX',Null,NUll,'EEE','1234' UNION ALL select 1,'TX','AAA' ,'3456',NULL,NULL UNION ALL select 1,'TX','BNH' ,'3467',NULL,NULL UNION ALL select 1,'TX','GFR' ,'1356',NULL,NULL UNION ALL select 1,'TX','UPY' ,'2345',NULL,NULL
你之前用GROUP BY的方式会把结果聚合为一行,无法满足保留多行的需求。以下两种方法可以实现目标:
方法一:子查询关联
先筛选出Col2和Col3不为NULL的有效行,再关联获取对应ID/State下的Col4、Col5非NULL值:
SELECT t.ID, t.State, t.Col2, t.Col3, c.Col4, c.Col5 FROM #table1 t JOIN ( SELECT ID, State, Col4, Col5 FROM #table1 WHERE Col4 IS NOT NULL AND Col5 IS NOT NULL ) c ON t.ID = c.ID AND t.State = c.State WHERE t.Col2 IS NOT NULL AND t.Col3 IS NOT NULL;
方法二:窗口函数
利用窗口函数在不合并行的前提下,直接获取每组ID/State的Col4、Col5最大值(即唯一的非NULL值),同时过滤掉无效行:
SELECT ID, State, Col2, Col3, MAX(Col4) OVER(PARTITION BY ID, State) AS Col4, MAX(Col5) OVER(PARTITION BY ID, State) AS Col5 FROM #table1 WHERE Col2 IS NOT NULL AND Col3 IS NOT NULL;
两种方法都能得到你期望的输出:
ID State col2 col3 Col4 Col5 1 TX AAA 3456 EEE 1234 1 TX BNH 3467 EEE 1234 1 TX GFR 1356 EEE 1234 1 TX UPY 2345 EEE 1234
内容的提问来源于stack exchange,提问作者unicorn
相关产品推荐
相关产品推荐

