【问题标题】:How to get records for last 3 months while grouping by each month如何在按月分组时获取最近 3 个月的记录
【发布时间】:2017-12-24 09:43:34
【问题描述】:

请问我如何对我的 MySQL 表中过去 3 个月的记录求和,但按月分组。

我想要这样的东西:

select SUM(amount) from table where.....
group by month

我正在执行以下操作,但没有返回任何结果

SELECT MONTHNAME(a.created_at) MONTH, YEAR(a.created_at) YEAR, SUM(a.credit) as credit, SUM(a.debit)
        FROM telco_transactions AS a
        WHERE a.telco_id = '1' and DATE(a.created_at) = DATE_ADD(NOW(), INTERVAL -3 MONTH)
        GROUP BY MONTHNAME(a.created_at), YEAR(a.created_at);

【问题讨论】:

  • 看起来很好,除了 = 可能应该是 >=
  • 当我设为 '>=' 时,它会返回 11 月、12 月、1 月的记录,而不是 10 月、11 月和 12 月的记录
  • 不,不是,当您选择 now() 时会得到什么?

标签: mysql sql


【解决方案1】:
select T.date_time, SUM(T.amount) from (
    -> select * from TEST_TABLE where date_time >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH) and date_time <= CURDATE())
    -> as T GROUP BY MONTH(T.date_time);

表格test_table看起来像

+------------+--------+
| date_time  | amount |
+------------+--------+
| 2017-12-24 |     30 |
| 2017-09-24 |     30 |
| 2017-12-04 |     30 |
| 2017-11-24 |     30 |
| 2017-11-09 |     30 |
| 2017-10-24 |     30 |
+------------+--------+

查询的输出看起来像

+------------+---------------+
| date_time  | SUM(T.amount) |
+------------+---------------+
| 2017-09-24 |            30 |
| 2017-10-24 |            30 |
| 2017-11-24 |            60 |
| 2017-12-24 |            60 |
+------------+---------------+

【讨论】:

  • 返回 4 个月
  • 返回 11 月、12 月、1 月的记录,而不是 10 月、11 月和 12 月的记录
  • 您想要过去三个月的日期,对吗?将其设为 -2 而不是 -3,那么它将为您提供所需的结果
  • 不幸的是,同样的事情
  • 我已经编辑了解决方案。以前的解决方案是选择大于当前日期最近三个月的日期。我所做的更改现在应该可以工作了。希望这会有所帮助!
【解决方案2】:

我会试试这个:

SELECT SUM(records) 
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(MONTH, -3, GETDATE()) 
GROUP BY DATEPART(MONTH, Date_Column)

【讨论】:

  • 你不应该使用一个 group by 不在你的 select 子句中的项目。
  • @radioactive 抱歉,我看到您使用的是 mysql。 DATEADD 用于 sql,请尝试改用 DATE_ADD。 DATEPART 也会因为 mysgl 报错,我想你可以在 mysql 中使用 MONTH(date_column)
  • @P.Salmon 你是对的,我上次写sql已经有一段时间了,我忘了它:)
  • @Rik 它返回 11 月、12 月、1 月而不是 10 月、11 月和 12 月的记录 -
  • @radioactive ok 到此为止,我认为当您使用 WHERE DATE_ADD(MONTH, -1, Date_Column) >= DATE_ADD(MONTH, -4, GETDATE()) 时它会起作用
【解决方案3】:

我找到了答案

SELECT MONTHNAME(a.created_at) as tmonth, YEAR(a.created_at) as tYear,
        SUM(a.credit) as credit, SUM(a.debit)
        FROM telco_transactions AS a
        WHERE a.telco_id = '1' and DATE(a.created_at) BETWEEN DATE(NOW())-INTERVAL 3 MONTH AND DATE(NOW())
        GROUP BY MONTHNAME(a.created_at), YEAR(a.created_at);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多