繁体   English   中英

如果没有找到该月的数据,如何获取最近 12 个月的数据并插入 0

[英]How to get last 12 months data and insert 0 if no data found for the month

我正在尝试使用以下查询在 Mysql 中获取最近 12 个月的数据,但我得到的所有数据不是最近 12 个月的数据,我只浏览了一些帖子但很有帮助我的 CreatedDate 格式就像'2020-04-17 12: 03:59'

SELECT date_format(createdDate,'%m') as Month, 
       count(*) as count, 
       date_format(createdDate,'%Y') as Year 
FROM tablename 
WHERE DATE_ADD(Now(),INTERVAL- 12 MONTH) 
GROUP BY Year,
         Month 
ORDER by Year desc,
         Month desc;

如果当月没有找到数据,还需要帮助您插入 0。

您可以在这里使用日历表:

SELECT
    cal.dt,
    COUNT(t.createdDate) AS count
FROM
(
    SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS dt UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 6 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 7 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 8 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 9 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 10 MONTH), '%Y-%m') UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 11 MONTH), '%Y-%m')
) cal
LEFT JOIN tablename t
    ON cal.dt = DATE_FORMAT(createdDate, '%Y-%m')
WHERE
    t.createdDate >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
    cal.dt
ORDER BY
    cal.dt DESC;

在 MySQL 8+ 中,您可以使用递归 CTE 生成日期:

with recursive dates as (
      select curdate() - interval (1 - day(curdate())) day as yyyymm, 1 as lev
      union all
      select yyyymm - interval 1 month, lev + 1
      from dates
      where lev < 12
     )
select d.yyyymm, count(t.createdDate) as cnt
from dates d left join
     tablename t
     on t.createdDate >= d.yyyymm and
        t.createdDate < d.yyyymm + interval 1 month
group by d.yyyymm;

请注意,这不会将年份和月份拆分为单独的列,但如果您真的需要,您可以这样做。

此外,这会为当前月份提供部分数据。 如果您只想要完整的月份,您可以调整逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM