MYSQL 中的 COALESCE + SUM 计算不正确
COALESCE + SUM in MYSQL incorrectly calculating
我正在使用 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 转换为十进制,并且应该在 SUM
之前执行 COALESCE
:
SELECT
SUM(
CAST(COALESCE(p.payment_amount, 0) AS DECIMAL(12,2))
) as amount_paid
FROM Payments as p
WHERE p.invoice = '13923';
我正在使用 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 转换为十进制,并且应该在 SUM
之前执行 COALESCE
:
SELECT
SUM(
CAST(COALESCE(p.payment_amount, 0) AS DECIMAL(12,2))
) as amount_paid
FROM Payments as p
WHERE p.invoice = '13923';