Как заменить пустую строку значением, которое не является пустым для того же PolicyNumber - PullRequest
0 голосов
/ 06 июня 2018

Цель состоит в том, чтобы заменить пустое значение в столбце ClaimType значением, которое не является пустым для каждого CoverageType и PolicyNumber

enter image description here

Почему-то написанное мной предложение SELECT не дает желаемого результата.В моем предложении WHERE я указал:

 where  
             PolicyNumber = c.PolicyNumber 
            and CoverageType = c.CoverageType  

Но почему для PolicyNumber 00002 у меня есть 'Occurance' для CPL CoverageType?

Я ожидал увидеть Occurrence-Pollution вместо:

enter image description here

Что мне здесь не хватает?

declare @ClaimType table (PolicyNumber varchar(50), QuoteID int,  CoverageType varchar(50), ClaimType varchar(100))

insert into @ClaimType values   ('00001',1, 'CGL', ' '),
                                ('00001',2, 'CGL', 'Occurrence'),
                                ('00002',1, 'CPL', ' '),
                                ('00002',2, 'CPL', 'Occurrence-Pollution')

select PolicyNumber,
        QuoteID,
        CoverageType,
        ClaimType,
        case when ClaimType = ' ' then (
                                        select top 1 ClaimType  
                                        from @ClaimType c 
                                        where   
                                                 PolicyNumber = c.PolicyNumber 
                                                and CoverageType = c.CoverageType 
                                        order by QuoteID desc
                                        ) 
                                        else ClaimType End as ClaimType1
from @ClaimType
go

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Это то, что вы хотите?

select ct.*,
       coalesce(nullif(ltrim(ClaimType), ''),
                max(ClaimType) over (partition by PolicyNumber, CoverageType)
               ) as ClaimType_2
from @ClaimType ct;
0 голосов
/ 06 июня 2018

Вы не обращаетесь к основному столу, поэтому

where PolicyNumber = c.PolicyNumber 
and   CoverageType = c.CoverageType 

всегда истинно.

Вам необходимо создать псевдоним для основного стола.

select PolicyNumber,
        QuoteID,
        CoverageType,
        ClaimType,
        case when ClaimType = ' ' then ( select top 1 ClaimType  
                                         from @ClaimType c 
                                         where m.PolicyNumber = c.PolicyNumber 
                                           and m.CoverageType = c.CoverageType 
                                         order by QuoteID desc
                                        ) 
                                   else ClaimType End as ClaimType1
from @ClaimType m
go
0 голосов
/ 06 июня 2018

Соотнесите подзапрос, или вы можете использовать LEAD.

select PolicyNumber,
        QuoteID,
        CoverageType,
        ClaimType,
        case when ClaimType = ' ' then (
                                        select top 1 ClaimType  
                                        from @ClaimType c 
                                        where   
                                                 x.PolicyNumber = c.PolicyNumber 
                                                and x.CoverageType = c.CoverageType 
                                        order by QuoteID desc
                                        ) 
                                        else ClaimType End as ClaimType1
from @ClaimType x


select
    PolicyNumber
    ,QuoteID
    ,CoverageType
    ,ClaimType
    ,ClaimType1 = case when ClaimType = '' or ClaimType is null then lead(ClaimType) over (partition by PolicyNumber, CoverageType order by QuoteID) else ClaimType end
from @ClaimType

Если есть несколько пробелов или разрывы шаблона, когда QuoteID = 2 не тот, который заполнен, я бы какпредложение where для подзапроса.Обратите внимание на добавленную мной дополнительную строку и добавление предложения where.

declare @ClaimType table (PolicyNumber varchar(50), QuoteID int,  CoverageType varchar(50), ClaimType varchar(100))

insert into @ClaimType values   ('00001',1, 'CGL', ' '),
                                ('00001',2, 'CGL', 'Occurrence'),
                                ('00002',1, 'CPL', ' '),
                                ('00002',2, 'CPL', 'Occurrence-Pollution'),
                                ('00002',3, 'CPL', '')  --added this row

select PolicyNumber,
        QuoteID,
        CoverageType,
        ClaimType,
        case when ClaimType = ' ' then (
                                        select top 1 ClaimType  
                                        from @ClaimType c 
                                        where   
                                                 x.PolicyNumber = c.PolicyNumber 
                                                and x.CoverageType = c.CoverageType 
                                                and c.ClaimType != '' --added this clause
                                        order by QuoteID desc
                                        ) 
                                        else ClaimType End as ClaimType1
from @ClaimType x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...