mysql - 递归查询以按月获取数据

标签 mysql

如何编写一个递归查询来返回按月份分组的数据?

举个例子,像这样......

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/

相关文章:

php - 尝试使用 php 将 session 变量传递到 mysql 查询中

MySQL - 选择列值仅为 0 的行,按另一列分组?

mysql - 什么对 SHA1 散列列的查找速度最快?

c# - 未作为根连接时,无法将类型 'System.DBNull' 的对象强制转换为类型 'System.String'

php - laravel 原始语法中的子查询

php - 使用 Bootstrap-Editable 时日期时间更新出错

php - MySQL 连接访问被拒绝,但只有 50% 的时间,在带有 Nginx-Proxy 的 Docker 中

java - LONG 作为 Hibernate 映射到 MySQL 的主键

php - 在mysql中同时向两个表插入数据

mysql - MySQL数据库中的非空表列表