如何编写一个递归查询来返回按月份分组的数据?
举个例子,像这样......
Month Amount
Jan £1000
Feb £1500
March £2000
目前,我正在运行 3 个单独的查询,计算一个月内所有交易的总和,然后将它们分组,然后合并所有内容。然而,这并不考虑 future 几个月或前几个月的情况。它本身是硬编码的。
我每个月都会做以下事情。
WHERE processing_time >= 2019-02-01 00:00:00
AND processing_time <= 2019-02-28 23:59:59
我需要一些可以显示 12 个月数据但也会动态变化的数据。
如果我今天检查,则为 2018 年 3 月至 2018 年 2 月;如果我下个月检查,则为 2018 年 4 月至 2019 年 3 月。
最佳答案
您不必使用递归查询来解决它。您可以使用“日历”表来填写缺失值。
对于月份名称生成,我会想到 MySQL/MariaDB 数字生成器。
SELECT
MONTHNAME(CURRENT_DATE + INTERVAL number_generator.number MONTH)
FROM (
SELECT
@row := @row + 1 AS number
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := -1
) init_user_params
) AS number_generator
WHERE
number_generator.number BETWEEN 0 AND 12
ORDER BY
number_generator.number ASC
结果
| MONTHNAME(CURRENT_DATE + INTERVAL number_generator.number MONTH) |
| ---------------------------------------------------------------- |
| March |
| April |
| May |
| June |
| July |
| August |
| September |
| October |
| November |
| December |
| January |
| February |
| March |
参见demo
编辑
This is very close but can I also get the start and end days of each month?
最后一天并不难,因为 MySQL 中有一个函数。
对于第一天,您需要更有创意地使用 LAST_DAY()
结合 +1 DAY
和 -1 MONTH
等间隔来获得该月的第一天。
SELECT
MONTHNAME(CURRENT_DATE + INTERVAL number_generator.number MONTH)
, ((LAST_DAY(CAST(CURRENT_DATE + INTERVAL number_generator.number MONTH AS DATE)))
+ INTERVAL 1 DAY) - INTERVAL 1 MONTH AS first_day_of_month
, (LAST_DAY(CAST(CURRENT_DATE + INTERVAL number_generator.number MONTH AS DATE))) AS last_day_of_month
结果
| MONTHNAME(CURRENT_DATE + INTERVAL number_generator.number MONTH) | first_day_of_month | last_day_of_month |
| ---------------------------------------------------------------- | ------------------ | ----------------- |
| March | 2019-03-01 | 2019-03-31 |
| April | 2019-04-01 | 2019-04-30 |
| May | 2019-05-01 | 2019-05-31 |
| June | 2019-06-01 | 2019-06-30 |
| July | 2019-07-01 | 2019-07-31 |
| August | 2019-08-01 | 2019-08-31 |
| September | 2019-09-01 | 2019-09-30 |
| October | 2019-10-01 | 2019-10-31 |
| November | 2019-11-01 | 2019-11-30 |
| December | 2019-12-01 | 2019-12-31 |
| January | 2020-01-01 | 2020-01-31 |
| February | 2020-02-01 | 2020-02-29 |
| March | 2020-03-01 | 2020-03-31 |
参见demo
关于mysql - 递归查询以按月获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55006344/