如何检查值是否为空,然后根据PolicyNumber选择一个不为空的值。SQL Server 2012
对于PolicyNumber ENV1,如果PolicyType为NULL,那么我需要选择一个非NULL的,即“Primary” 与策略ENV3相同:ID 005具有空值,因此它需要选择下一个非空值,用于如何检查值是否为空,然后根据PolicyNumber选择一个不为空的值。SQL Server 2012,sql,sql-server,tsql,Sql,Sql Server,Tsql,对于PolicyNumber ENV1,如果PolicyType为NULL,那么我需要选择一个非NULL的,即“Primary” 与策略ENV3相同:ID 005具有空值,因此它需要选择下一个非空值,用于PolicyNumberENV3,它应该是“Claim Make” 有没有办法不分组就实现这一点 declare @TestTable table ( ID int,
PolicyNumber
ENV3,它应该是“Claim Make”
有没有办法不分组就实现这一点
declare @TestTable table
(
ID int,
PolicyNumber varchar(50),
PolicyType varchar(50)
)
insert into @TestTable
values (001, 'ENV1','Primary'), (002, 'ENV1',NULL),
(003, 'ENV2','Claim Made'), (004, 'ENV3','Claim Made'),
(005, 'ENV3',NULL)
select
ID,
PolicyNumber,
PolicyType
from
@TestTable
输出:
ID PolicyNumber PolicyType
-------------------------------
1 ENV1 Primary
2 ENV1 NULL
3 ENV2 Claim Made
4 ENV3 Claim Made
5 ENV3 NULL
使用
当然,如果存在连续的NULL
值,我们可以通过两种方法来处理。这里有一个:
declare @TestTable table (ID int, PolicyNumber varchar(50), PolicyType varchar(50))
insert into @TestTable values
(001, 'ENV1','Primary'),
(002, 'ENV1',NULL),
(003, 'ENV2','Claim Made'),
(004, 'ENV3','Claim Made'),
(005, 'ENV3',NULL),
(006, 'ENV3',NULL)
select t.ID,
t.PolicyNumber,
PolicyType = case when t.PolicyType is null then (select top 1 PolicyType
from @TestTable
where PolicyType is not null
and PolicyNumber = t.PolicyNumber
order by ID desc)
else PolicyType end
from @TestTable t
我将使用窗口函数来完成此操作:
select t.*,
coalesce(policy_number,
max(policynumber) over (partition by id)
) as new_policy_number
from t;
如果您使用的是2012+,则可以使用
LAG
。你能标记SQL Server的版本吗?是的,它的SQL Server 2012完美!谢谢你这么好的回答!我相信它是max(PolicyType)超过了(按PolicyNumber划分)
select t.*,
coalesce(policy_number,
max(policynumber) over (partition by id)
) as new_policy_number
from t;