【问题标题】:how to check whether one of Claimants have Status 0 and assign Claim Status based on that如何检查其中一个索赔人是否具有状态 0 并根据该状态分配索赔状态
【发布时间】:2019-04-01 23:01:33
【问题描述】:

每个声明可以有多个声明人。 如果这些声明中至少有一个拥有ClaimantStatus = 0,则认为声明为'Open'

所以我需要检索关于 Claim Level(不是 Claimants)的数据并创建列 ClaimStatus 来指示 Claim 是 Open 还是 Closed

对于每个ClaimID,我需要检查是否至少有一个索赔人有ClaimantStatus = 0(打开),如果这是真的,那么列ClaimStatus应该是='Open',否则应该是=@987654332 @

 declare @ClaimsTable table (ClaimID varchar(20))
 insert into @ClaimsTable values ('Claim1'),
                                 ('Claim2'),
                                 ('Claim3'),
                                 ('Claim4')

declare @ClaimantsTable table (ClaimID varchar(20),  ClaimantName varchar(50), ClaimantStatus int)
insert into @ClaimantsTable values ('Claim1','Claimant1',1),
                                   ('Claim1','Claimant2',0),
                                   ('Claim1','Claimant3',1),
                                   ('Claim2','Claimant2',0),
                                   ('Claim3','Claimant1',1),
                                   ('Claim3','Claimant2',1),
                                   ('Claim3','Claimant3',1),
                                   ('Claim4','Claimant1',0),
                                   ('Claim4','Claimant2',0)
--select * from @ClaimantsTable

select ClaimID,
        (select count (ClaimantName) from @ClaimantsTable ct where ct.ClaimID = c.ClaimID) as NumberOfClaimants,
    --below statement does not work correctly
        (select top 1 case when ClaimantStatus in (0) then 'Open' Else 'Closed' end as t from @ClaimantsTable ct where ct.ClaimID = c.ClaimID) as ClaimStatus
from @ClaimsTable c

正确答案应该是这样的:

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

    看起来一个简单的GROUP BY 就足够了。 如果至少有一个Claimant 的 ClaimantStatus = 0,则Claim 处于打开状态,我们可以使用MIN 来确定这一点。这里我们依赖 ClaimantStatus 只有 01 值。

    SELECT
        Claims.ClaimID
        ,COUNT(*) AS NumberOfClaimants
        ,CASE WHEN MIN(Claimants.ClaimantStatus) = 0 
            THEN 'Open' 
            ELSE 'Closed' 
        END AS ClaimStatus
    FROM
        @ClaimsTable AS Claims
        INNER JOIN @ClaimantsTable AS Claimants ON Claimants.ClaimID = Claims.ClaimID
    GROUP BY
        Claims.ClaimID
    ORDER BY
        Claims.ClaimID;
    

    【讨论】:

    • 非常简单的方法!谢谢
    【解决方案2】:

    我认为使用 Exists 是您正在寻找的内容

    select ClaimID,
        (select count (ClaimantName) from @ClaimantsTable ct where ct.ClaimID = c.ClaimID) as NumberOfClaimants,
        CASE WHEN EXISTS(SELECT 1 
                        FROM @ClaimantsTable AS claimant 
                        WHERE claimant.ClaimID = c.ClaimID
                            AND claimant.ClaimantStatus = 0) 
            THEN 'Open' 
            ELSE 'Closed' END AS claimStatus
    from @ClaimsTable c
    

    根据您的情况,您还可以考虑分组查询。通过不需要对计数和状态进行两次单独的查找,这可以更有效。这确实要求每个索赔至少有 1 个索赔人。

    SELECT
        claim.ClaimId
        ,COUNT(*) AS NumberOfClaimants
        ,CASE WHEN SUM(CASE WHEN claimant.ClaimantStatus = 0 THEN 1 ELSE 0 END) > 0 THEN 'Open' ELSE 'Closed' END AS claimStatus
    FROM
        @ClaimsTable AS claim
        INNER JOIN @ClaimantsTable AS claimant
            ON claim.ClaimID = claimant.ClaimID
    GROUP BY
        claim.ClaimID
    

    【讨论】:

    • 完美。谢谢!
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2019-04-30
    • 2019-08-01
    • 2018-08-23
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多