您将如何编写一个递归查询,该查询可以带回按月分组的数据?
例如,类似的东西...
Month Amount
Jan £1000
Feb £1500
March £2000
目前,我正在运行3个单独的查询,这些查询在一个月内计算所有交易的总和,然后将它们分组,然后将所有内容组合在一起。但是,这并不是在未来几个月或前几个月内考虑。它本身是硬编码
我正在做的是每个月的以下内容。
WHERE processing_time >= 2019-02-01 00:00:00
AND processing_time <= 2019-02-28 23:59:59
我需要一些可以向我展示价值12个月的数据但也会动态变化的东西。
因此,如果我在今天和2018年4月检查到2018年3月3日至2018年2月,如果我在下个月检查。
您不必使用递归查询来解决它。您可以使用"日历"表来填写缺失值。
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 |
请参阅演示
编辑
这很接近,但我也可以得到每个的开始和结束日子 一个月?
最后一天并不难,因为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