sql - SQL 减法使用多个 CASE WHEN ELSE 导致 GROUP BY 问题
问题描述
我目前在 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
SELECT
但是,我想要做的是在依赖 if中有以下三行THREE.CENTRE = 'ACS 50% GM'
。
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' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中
因为您没有THREE.CENTRE
在Group BY
子句中添加列。如果您需要将其包含在SELECT
其中,则应将其添加到Group BY
子句中。而不是CASE
你甚至可以使用 IIF()
. THREE.CENTRE
如果您在添加时没有问题,GROUP BY
请尝试以下代码。
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
推荐阅读
- python - 如何将具有 ResNet 等非序列架构的 Keras 模型拆分为子模型?
- c# - Unity - 我如何将铅笔移动到高于鼠标的位置
- python - 连接到 mongo 数据库,给定 ssh 密钥
- sql - SQL - 使用 AND 与使用子查询的 INNER JOIN
- android - android启动时如何setenforce 0
- compiler-optimization - GraalVM:如何实现编译器优化?
- vba - 如何调用excel函数并发送参数
- javascript - 如何通过 React 中的数字键从枚举中获取值
- django - 不使用 GenericForeignKey 的抽象 ForeignKey
- javascript - 如何从 Sharepoint Online 中的查找列中检索文本?