如何检查值是否为空,然后根据PolicyNumber选择一个不为空的值。SQL Server 2012

如何检查值是否为空,然后根据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 ENV1,如果PolicyType为NULL,那么我需要选择一个非NULL的,即“Primary”

与策略ENV3相同:ID 005具有空值,因此它需要选择下一个非空值,用于
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;