【问题标题】:T-Sql Sum Positive and Negative Float ValueT-Sql Sum 正负浮点值
【发布时间】:2018-04-17 06:47:44
【问题描述】:
WITH CTE AS
(
    SELECT 
        ITM.CODE AS ITMCODE,
        CASE 
           WHEN IOCODE IN (1,2) THEN AMOUNT 
           ELSE AMOUNT * -1 
        END AS AMOUNT
    FROM 
        ITEMLINE ITL, ITEMS ITM 
    WHERE 
        ITL.ITEMREF = ITM.LOGICALREF 
        AND ITM.CODE = '123'
)
SELECT 
    ITMCODE, SUM(AMOUNT)  
FROM 
    CTE 
GROUP BY 
    ITMCODE

从 CTE 返回 5 行,数量为 float 类型。 Sum 函数返回 2,27373675443232E-13。如果我不使用 Amount * -1 没有问题,返回值是正常的。是什么原因造成的?这从一个视图返回,我不能改变它被禁止的视图,我必须修复这些值。五行的值是 5,6,7,8,9。谢谢。

【问题讨论】:

标签: sql sql-server tsql select sum


【解决方案1】:

首先,您的查询太复杂了。做吧:

SELECT ITM.CODE AS ITMCODE,
       SUM(CASE WHEN IOCODE IN (1, 2) THEN AMOUNT ELSE AMOUNT * -1 
           END) AS AMOUNT
FROM ITEMLINE ITL JOIN
     ITEMS ITM 
     ON ITL.ITEMREF = ITM.LOGICALREF 
WHERE ITM.CODE = '123'
GROUP BY ITM.CODE;

其次,这是浮点数的本质。您应该将金额存储为decimal/numeric,定点数。

你应该可以通过转换为合适的类型得到你想要的:

SELECT ITM.CODE AS ITMCODE,
       CONVERT(DECIMAL(10, 2),  -- or whatever
               SUM(CASE WHEN IOCODE IN (1, 2) THEN AMOUNT ELSE AMOUNT * -1 
                   END)
              ) AS AMOUNT
FROM ITEMLINE ITL JOIN
     ITEMS ITM 
     ON ITL.ITEMREF = ITM.LOGICALREF 
WHERE ITM.CODE = '123'
GROUP BY ITM.CODE;

但是,我建议您修复表中的数据,以便以更适合货币金额的方式存储金额,因此:

alter table itemline alter column amount decimal(12, 4);  -- or whatever

【讨论】:

  • 问题不在于查询。查询只是一个例子。当我更新行manuel时,例如UPDATE ITEMLINE SET AMOUNT = 5 WHERE REF = 1,UPDATE ITEMLINE SET AMOUNT = 6 WHERE REF = 2 ..没有问题。价值观有问题。我需要修复它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多