问题描述
我正在使用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';