mysql - 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
我需要按最长延迟订购,甚至添加订购,我不能!是否有可能做到这一点?
解决方案
您偶然发现了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)
首先获取最旧的项目。
推荐阅读
- java - java-redis中的一个键是否存在具有不同对象的不同值的多重映射?
- android - 协程持有的泄漏服务
- dataframe - Rust polars: IntoSeries 特征没有为 &Series 实现
- powershell - Powershell XML 到 CSV
- directory - 如何通过ansible检查多个目录中的777权限
- android - 如何将未标记的 UI 元素扩展为对讲的图标?
- oracle - 当我尝试打开由 Oracle 外部表写入的 .log 和 .bad 文件时,我得到拒绝访问
- python - 我在用 python 编写的阶乘程序中遇到错误
- qt - 在 eventFilter 中绘制事件后无法清除 QLabel 内容
- django - Django:访问不同服务器上的数据库:“fastCGI 进程超出了配置的活动超时”