【问题标题】:MYSQL - Get all months between two dates (from, to) and data for this monthsMYSQL - 获取两个日期(从,到)之间的所有月份以及本月的数据
【发布时间】:2020-11-02 13:41:15
【问题描述】:

我有类似的桌子:

| id       | date        | user_id  | value |
---------------------------------------------
| 1        | 2019-01-10  |   3      | 20
| 2        | 2019-04-08  |   3      | 30
| 3        | 2019-06-04  |   3      | 40
| 4        | 2019-08-20  |   3      | 50 
| 5        | 2019-11-19  |   3      | 60
| 6        | 2019-01-11  |   4      | 70
| 7        | 2019-02-20  |   4      | 11
| 8        | 2019-03-11  |   4      | 12
| 9        | 2019-07-12  |   4      | 23
--------------------------------

我想获取两个日期之间的值:date_from 和 date_to。以及从这个间隔开始的所有月份。

例如:

date_from = 2019-01-08; date_to = 2019-09-10;

所以对于 user_id = 3 我想得到类似的东西:

   | date     | value
    -------------------------
   | 2019-01  |   20      |
   | 2019-02  |   NULL    |
   | 2019-03  |   NULL    |
   | 2019-04  |   30      |
   | 2019-05  |   NULL    |
   | 2019-06  |   40      |
   | 2019-07  |   NULL    |
   | 2019-08  |   50      |
   | 2019-09  |   NULL    |
    --------------------------

有人帮助我吗?谢谢!

【问题讨论】:

  • 您的结果是按月计算的,但您的时间段是按天计算的,这似乎很奇怪。
  • 一个用户一个月内可以有多个条目吗?如果是,是否要添加该值?
  • @Turo 不,它不能。
  • @GordonLinoff 它只是因为我需要它来制作图表,所以我只需要没有日期的年份和月份。
  • 考虑处理应用代码中数据显示的问题(例如缺失值)

标签: mysql sql


【解决方案1】:

您可以使用递归 CTE 生成日期,然后 left join:

with recursive dates as (
      select date('2019-01-08') as dte
      union all
      select dte + interval 1 day
      from dates
      where dte < '2019-09-10'
     )
select extract(year_month from d.dte) as yyyymm, sum(t.value)
from dates d left join
     t
     on d.dte = t.date and t.user_id = 3
group by yyyymm;

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2018-11-11
    • 2015-11-29
    相关资源
    最近更新 更多