使用 sum、case 和 negate 值时,我会得到双倍的值

问题描述 投票:0回答:4

当尝试使用求和函数时,我在使用 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),总和也是正确的。

sql sql-server sum case
4个回答
1
投票

我相信您的查询对于您显示的数据是正确的,但您可能有您不期望的数据。

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 之前应该首先验证源数据。


1
投票

首先验证子查询并尝试该方法,

在选择求和之前尝试转换为数字:

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

0
投票

我不确定是什么原因造成的,但我的绕过结果只是暂时将 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

0
投票

有同样的问题,这是我的情况: 蟒蛇/sqlalchemy

  1. 收到此警告: sys:1: SAWarning: SELECT 语句在 FROM 元素“students”和 FROM 元素“entries”之间存在笛卡尔积。 在每个元素之间应用连接条件来解决。
  2. 原来我尝试按对象的属性进行过滤,但我还没有加入对象本身
© www.soinside.com 2019 - 2024. All rights reserved.