繁体   English   中英

SQL 使用多个 CASE WHEN ELSE 减去导致 GROUP BY 问题

[英]SQL subtract using multiple CASE WHEN ELSE resulting in GROUP BY issue

我目前在 SSMS 中有以下查询。 (仅供参考,我将列名和数据库名隐藏为敏感信息)

SELECT  ONE.PROJECT_CODE as 'A',
        sum(ONE.HOME_VALUE) as 'B',
        TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) as 'C',
        TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) - sum(ONE.HOME_VALUE) as 'D',
        (((TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0)) - sum(ONE.HOME_VALUE))/2) as 'E'
FROM X.dbo.AA_CST_CENTRE_TRANSACTION_SIMPLE_VIEW as ONE
LEFT JOIN X.dbo.CFMS_Charters_FlightsAndGrossMargin_IncICFLIGHT as TWO
    ON ONE.PROJECT_CODE = TWO.Charter_Number
LEFT JOIN X.dbo.TB_ACS_CARPAS_OUTSTANDING as THREE
    ON ONE.PROJECT_CODE = THREE.Project and TWO.Charter_Number = THREE.Project
WHERE ONE.CT_DEADLINE between '1/2/2021' and '2/28/2021'
and ONE.COSTCENTRE_CODE= 'ACS 50% GM'
and ONE.CT_TRANTYPE= 'MSC'
GROUP BY ONE.PROJECT_CODE, TWO.Charter_Gross_Margin, THREE.OP_OUTSTANDING
Having sum(ONE.HOME_VALUE) <> 0

但是,如果THREE.CENTRE = 'ACS 50% GM' ,我想要做的是在SELECT中使用以下三行。

TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) as 'C',
TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) - sum(ONE.HOME_VALUE) as 'D',
TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0)) - sum(ONE.HOME_VALUE))/2) as 'E'

如果ACS 50% GM不存在,那么我想删除ISNULL(THREE.OP_OUTSTNADING, 0)

我相信我需要为每一行做CASE WHEN 我已经尝试了以下方法,但我得到column X.dbo.TB_ACS_CARPAS_OUTSTANDING.Centre' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause ,我不是 100%

任何帮助将不胜感激!

SELECT  ONE.PROJECT_CODE as 'A',
        sum(ONE.HOME_VALUE) as 'B',
CASE WHEN THREE.CENTRE= 'ACS 50% GM'
        THEN TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0)
        ELSE TWO.Charter_Gross_Margin
    END AS 'C',
CASE WHEN THREE.CENTRE = 'ACS 50% GM'
        THEN TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) - sum(ONE.HOME_VALUE)
        ELSE TWO.Charter_Gross_Margin - sum(ONE.HOME_VALUE)
    END AS 'D',
CASE WHEN THREE.CENTRE = 'ACS 50% GM'
        THEN (((TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0)) - sum(ONE.HOME_VALUE))/2)
        ELSE (TWO.Charter_Gross_Margin - sum(ONE.HOME_VALUE))/2
    END AS 'E'
FROM X.dbo.AA_CST_CENTRE_TRANSACTION_SIMPLE_VIEW as ONE
LEFT JOIN X.dbo.CFMS_Charters_FlightsAndGrossMargin_IncICFLIGHT as TWO
    ON ONE.PROJECT_CODE = TWO.Charter_Number
LEFT JOIN X.dbo.TB_ACS_CARPAS_OUTSTANDING as THREE
    ON ONE.PROJECT_CODE = THREE.Project and TWO.Charter_Number = THREE.Project
WHERE ONE.CT_DEADLINE between '1/2/2021' and '2/28/2021'
and ONE.COSTCENTRE_CODE= 'ACS 50% GM'
and ONE.CT_TRANTYPE= 'MSC'
and THREE.CENTRE= 'ACS 50% GM'
GROUP BY ONE.PROJECT_CODE, TWO.Charter_Gross_Margin, THREE.OP_OUTSTANDING
Having sum(ONE.HOME_VALUE) <> 0

你得到

列 X.dbo.TB_ACS_CARPAS_OUTSTANDING.Centre' 在 select 列表中无效,因为它不包含在聚合 function 或 GROUP BY 子句中

因为您没有在Group BY子句中添加列THREE.CENTRE 如果您需要将其包含在SELECT中,则应将其添加到Group BY子句中。 您甚至可以使用IIF()而不是CASE 如果您在GROUP BY中添加THREE.CENTRE没有问题,请尝试以下代码。

SELECT  ONE.PROJECT_CODE AS 'A',
        SUM(ONE.HOME_VALUE) AS 'B',
        IIF(THREE.CENTRE= 'ACS 50% GM',TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0),TWO.Charter_Gross_Margin) AS 'C',
        IIF(THREE.CENTRE= 'ACS 50% GM',TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0) - SUM(ONE.HOME_VALUE),TWO.Charter_Gross_Margin - sum(ONE.HOME_VALUE)) AS 'D',
        IIF(THREE.CENTRE= 'ACS 50% GM',(((TWO.Charter_Gross_Margin - ISNULL(THREE.OP_OUTSTANDING, 0)) - SUM(ONE.HOME_VALUE))/2),((TWO.Charter_Gross_Margin - sum(ONE.HOME_VALUE))/2)) AS 'E'
FROM X.dbo.AA_CST_CENTRE_TRANSACTION_SIMPLE_VIEW as ONE
LEFT JOIN X.dbo.CFMS_Charters_FlightsAndGrossMargin_IncICFLIGHT as TWO
    ON ONE.PROJECT_CODE = TWO.Charter_Number
LEFT JOIN X.dbo.TB_ACS_CARPAS_OUTSTANDING as THREE
    ON ONE.PROJECT_CODE = THREE.Project and TWO.Charter_Number = THREE.Project
WHERE ONE.CT_DEADLINE between '1/2/2021' and '2/28/2021'
and ONE.COSTCENTRE_CODE= 'ACS 50% GM'
and ONE.CT_TRANTYPE= 'MSC'
GROUP BY ONE.PROJECT_CODE, TWO.Charter_Gross_Margin, THREE.OP_OUTSTANDING,THREE.CENTRE
HAVING SUM(ONE.HOME_VALUE) <> 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM