当尝试使用求和函数时,我在使用 CASE 和负值时得到错误的值,我不明白为什么。 (负值被减去两次)。
我的目标是 c_calcType 类型为“calcCorrection”,从 sum/groupBy 中减去它。
使用时:
SELECT Sum(CASE WHEN c_calcType = 'calcCorrection' THEN (c_calcValue * -1)
ELSE c_calcValue END) as c_calcValue,
c_parentID
FROM DB_Calc
WHERE c_parentID is not null AND c_state <> 'deactiveted'
GROUP BY c_parentID
我得到的值(c_calcValue)返回500,但我除外750。当过滤和进行手动计算时,我得到了正确的值。
作为示例的表格如下所示:
c_calcvalue | c_parentID | c_calcType |
---|---|---|
1000 | 5 | 无 |
250 | 5 | 计算修正 |
奇怪的是,如果说
WHERE c_ParentID = 5 AND c_calcType = 'calcCorrection'
,我会得到-250,或者如果我在THEN表达式中说(THEN 0 else c_calcValue),总和也是正确的。
我相信您的查询对于您显示的数据是正确的,但您可能有您不期望的数据。
有
CREATE TABLE DB_Calc (
c_calcvalue int NOT NULL,
c_calcType varchar(200) NOT NULL,
PRIMARY KEY (c_calcvalue,c_calcType)
)
INSERT INTO DB_Calc (c_calcvalue, c_calcType) VALUES
(1000, 'None'),
(250, 'calcCorrection');
以下选择
SELECT Sum(CASE WHEN c_calcType = 'calcCorrection' THEN (c_calcValue * -1)
ELSE c_calcValue END) as c_calcValue
FROM DB_Calc
生产750:
c_calcValue
750
小提琴在这里。
我同意 M.Ghandour 的观点,即在进行 SUM 之前应该首先验证源数据。
首先验证子查询并尝试该方法,
在选择求和之前尝试转换为数字:
SELECT (CASE
WHEN c_calcType = 'calcCorrection' THEN (CONVERT(c_calcValue, INT) * -1)
ELSE CONVERT(c_calcValue, INT)
END)
AS c_calcValue,
c_parentID
FROM DB_Calc
WHERE c_parentID IS NOT NULL AND c_state <> 'deactiveted'
如果有效,请尝试以下操作:
SELECT SUM (cValTable.c_calcValue), cValTable.c_parentID
FROM (SELECT (CASE
WHEN c_calcType = 'calcCorrection' THEN (CONVERT(c_calcValue, INT)* -1)
ELSE CONVERT(c_calcValue, INT)
END)
AS c_calcValue,
c_parentID
FROM DB_Calc
WHERE c_parentID IS NOT NULL AND c_state <> 'deactiveted') cValTable
GROUP BY cValTable.c_parentID
我不确定是什么原因造成的,但我的绕过结果只是暂时将 calcCorrection 分成两个查询并使用 union all。
SELECT sum(c_calcValue),c_parentID FROM DBCalc WHERE r_Rechnungstyp <> 'calcCorrection' AND c_state <> 'deactiveted' GROUP BY c_parentID UNION ALL SELECT sum(-c_calcValue),c_parentID FROM DBCalc WHERE r_Rechnungstyp = 'calcCorrection' AND c_state <> 'deactiveted' GROUP BY c_parentID
有同样的问题,这是我的情况: 蟒蛇/sqlalchemy