SQL Server - 正确分组字段

时间:2017-08-31 16:06:03

标签: sql-server

我正在运行查询

选择

    YEAR(TL_SYS_DATE)               AS [YEAR]
    ,MONTH(TL_SYS_DATE)             AS [MONTH]
    ,NEW_PRODUCT_NAME               AS [PRODUCT]
    ,COMP_PDT_CODE                  AS PROD_CODE
    ,NEW_CONTRACT_NO
    ,NEW_STATUS
    ,PREMIUM_AMT

    ,COUNT(DISTINCT CASE WHEN TERM_LENGTH = '10 Year' AND NEW_STATUS IN ('Active/Restrict','Active') THEN
            NEW_CONTRACT_NO 
    END)                                            AS [10 YR CONTRACTS]


    ,SUM(CASE WHEN TERM_LENGTH = '10 Year' AND NEW_STATUS IN ('Active/Restrict','Active') THEN
            PREMIUM_AMT
    END)                                            AS [10 YR Premium]

    ,SUM(CASE WHEN NEW_STATUS IN ('Surr/Freelook', 'Terminated/Surr','Withdrawn') THEN
            SURRENDER_VALUE
    END)                                            AS [Surr/Term/Withdrawn Amount]     

    ,SUM(CASE WHEN NEW_STATUS NOT IN ('Surr/Freelook', 'Terminated/Surr','Withdrawn') THEN
            ACCOUNT_VALUE
    END)                                            AS [ACCOUNT VALUE]

    -- NEW_STATUS NOT IN ('Surr/Freelook', 'Terminated/Surr','Withdrawn') AND TERM_LENGTH != '10 Year'

    ,COUNT(DISTINCT CASE WHEN UPPER(NEW_STATUS) = 'CLAIM' THEN
            NEW_CONTRACT_NO 
    END)                                            AS [Death Claim Contracts]

FROM
    DB1
    where YEAR(TL_SYS_DATE) = '2014'
    and MONTH(TL_SYS_DATE) = '4'
    AND PREMIUM_AMT > 0
GROUP BY
    YEAR(TL_SYS_DATE)
    ,MONTH(TL_SYS_DATE)
    ,NEW_PRODUCT_NAME
    ,ACCOUNT_VALUE      
    ,COMP_PDT_CODE
    ,NEW_CONTRACT_NO
    ,NEW_STATUS
    ,PREMIUM_AMT

导致

Result 1

我想要做的是总结PREMIUM_AMT而不是ACCOUNT_VALUE

因此,对于合约6880000153,它将是PREMIUM_AMT = 110500.00和ACCOUNT VALUE 105306.07全部在一行。

1 个答案:

答案 0 :(得分:1)

您可以将结果包装在CTE中并从那里汇总

WITH CTE_Example
AS
(
your query
)
SELECT MAX(YEAR),
       MAX(MONTH),
       NEW_CONTRACT_NO,
       MAX(NEW_STATUS),
       SUM(PREMIUM_AMT),
       MAX([ACCOUNT VALUE]),
       MAX([Death Claim Contracts])
FROM CTE_Example
GROUP BY NEW_CONTRACT_NO

所以有些免责声明,这会聚合并产生你想要的结果。但我真的对使用MAX(NEW_STATUS)而不知道你的整个数据方案持怀疑态度。因为如果6880000153具有Claim和Suspended的组合,它将始终产生Suspended,因为它按字母顺序更大,可能不是您需要的。此外,我没有将列[10 YR Premium]和[Surr / Term / Withdrawn Amount]放入,因为它们是NULL。但随意添加它们并适当地聚合。