MYSQL中的COALESCE + SUM错误计算

问题描述

我正在使用COALESCE和SUM来获取每张发票的总付款额。以下是相关数据。

SELECT 
    COALESCE(SUM(p.payment_amount),0) as amount_paid 
FROM Payments as p 
WHERE p.invoice = '13923';

以下是与问题相关的数据库信息

invoice   type    payment_amount
13923    Credit    51.19
13923    Check     592.93

问题是,发票上的应付总额为644.12。当我手动将两个付款金额加在一起时,等于644.12,这是确切的付款。但是,当我运行查询并查看结果时,它表明payment_amount = 644.1199999999999

有人知道这是怎么回事,还是看到我的代码有任何问题或执行此操作的更好方法

注意:我使用COALESCE的原因是,有时有付款而有时没有。因此,我需要将值设为已支付的总金额,或者如果未在付款中找到任何记录,则为0。这段代码在较长的查询中组合在一起,但尝试仅发布相关数据。

解决方法

我相信使用ROUND函数可以为您提供所需的结果

ROUND(COALESCE(SUM(p.payment_amount),0),2)

在评论中进一步讨论之后,这将是我建议的解决方案

payment_amount列更新为DECIMAL(15,2)数据类型

CREATE TABLE `Payments` (
  `payment_amount` decimal(15,2) DEFAULT NULL
);

INSERT INTO `Payments` (`payment_amount`) VALUES ('51.19');

INSERT INTO `Payments` (`payment_amount`) VALUES ('592.93');

SELECT SUM(payment_amount) FROM Payments;

输出644.12

,

您可以使用CAST将sim转换为十进制,并且应该在COALESCE之前执行SUM

SELECT 
    SUM(
      CAST(COALESCE(p.payment_amount,0) AS DECIMAL(12,2))
    ) as amount_paid 
FROM Payments as p 
WHERE p.invoice = '13923';