首页 > 解决方案 > MYSQL - 添加列并计算日期的逾期天数并按最长延迟排序

问题描述

假设我有一个tb_invoice包含以下字段和金额的表格:

id | transaction_id | value    | due
1  | 1              | 1109.97  | 2020-02-19
2  | 1              | 10,      | 2019-05-01

我想添加值列,计算延迟天数并按最长延迟排序。

通过下面的查询,我什至可以得到某种结果,但这仍然不是我需要的:

SELECT *, SUM(value) AS total, DATEDIFF(CURDATE(), due) as delay
FROM tb_invoice
WHERE transaction_id = 1
GROUP BY transaction_id

这给我带来了以下结果:

id | transaction_id | value   | due | total   | delay
1  | 1              | 1109.97 | 2020-02-19    | 1119.97 | 91

我需要按最长延迟订购,甚至添加订购,我不能!是否有可能做到这一点?

标签: mysqlaggregate-functions

解决方案


您偶然发现了MySQL 对 GROUP BY 的臭名昭著的非标准扩展。您的 SELECT 提到的值DATEDIFF(CURDATE(), due)不是聚合函数,也没有在 GROUP BY 子句中提及。所以它实际上意味着DATEDIFF(CURDATE(), ANY_VALUE(due));

一个很好的思考方式ANY_VALUE()MAYBE_THE_VALUE_YOU_WANT_MAYBE_NOT()。换句话说,它不是确定性的。

试试这个列值DATEDIFF(CURDATE(), MIN(due))。用于ORDER BY MIN(due)首先获取最旧的项目。


推荐阅读