每月查询一次以获取数据的递归查询

时间:2019-03-05 15:33:27

标签: mysql

您将如何编写一个可以带回按月分组的数据的递归查询?

例如,像这样的东西...

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年3月至2018年2月,如果我下个月检查的是2018年4月至2019年3月。

1 个答案:

答案 0 :(得分:1)

您不必使用递归查询来解决它。您可以使用“日历”表填写缺失值。
一个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

修改

  

这非常接近,但我还能获得每个开始日期和结束日期   一个月?

最后一天并不难,因为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