zoukankan      html  css  js  c++  java
  • MySQL 统计某张表过去12个月的数据(包括本月)

    现在有一张 x02人员 表。

    CREATE TABLE `x02人员` (
      `人员ID` varchar(32) NOT NULL,
      `姓名` varchar(20) DEFAULT NULL,
      `出生日期` date DEFAULT NULL,
      `移动电话` varchar(11) DEFAULT NULL
      `创建时间` datetime DEFAULT CURRENT_TIMESTAMP,
      `最近修改时间` datetime DEFAULT NULL,
      `数据状态` varchar(2) DEFAULT NULL,
      PRIMARY KEY (`人员ID`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
    

    现在欲统计过去12个月的数据,如现在这个月是2020年12月,那么我们需要统计从2020年12月到2020年1月的数据情况。而这12个月中,如果这个月没有数据的,则统计为0。

    1、获取12个月到现在的数据

    select * from x02人员 t where DATE_FORMAT(t.创建时间,'%Y-%m') 
    > DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m');
    

    2、统计在过去12个月中每个月数据状态等于1的数据之和。

    select DATE_FORMAT(t.创建时间,'%Y-%m') month, count(t.人员ID) count from x02人员 t
    where t.数据状态='1' AND  DATE_FORMAT(创建时间,'%Y-%m')>
    DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m')
    group by month;
    

    这时候可能会发现,原始数据中只有几个月的数据,还有其它剩余几个月按要求应该是显示为0的。

    3、用一个笨点的方法获取过去12个月所有的月份。

    创建一个查找过去12个月的视图,当然这里你也可以使用存储过程遍历地把12个月插入到一个临时表中,代码会更优雅一点。

    drop view if exists past_12_month_view;
    
    CREATE VIEW `past_12_month_view` AS
        SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 2 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 3 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 4 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 5 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 6 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 7 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 8 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 9 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 10 MONTH), '%Y-%m') AS `month` 
        UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 11 MONTH), '%Y-%m') AS `month`
    ;
    

    查看12个月的显示情况:

    select t.month from past_12_month_view t group by t.month;
    

    4、最后,把上述 3 的12个月的显示数据与 2 的 查询结果关联查询

    SELECT
    	v.month, ifnull(b.count, 0) count
    FROM past_12_month_view v LEFT JOIN 
    (
    	SELECT
    		DATE_FORMAT(t.创建时间, '%Y-%m') month,
    		count(t.人员ID) count
    	FROM
    		`x02人员` t
    	WHERE DATE_FORMAT(t.创建时间, '%Y-%m') > DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 12 MONTH),'%Y-%m') 
    	GROUP BY month 
    	ORDER BY month desc
    	limit 12 
    ) b ON v.month = b.month
    GROUP BY v.month
    ORDER BY v.month DESC
    ;
    

    参考原文:https://developer.aliyun.com/article/28732

    以上。

  • 相关阅读:
    字符串数组和字符串的转换
    项目总结3
    解决几种中文乱码的问题
    ipms的sql语句
    ipms综合管理系统的总结2
    ipms综合管理系统的总结
    简答题汇总
    log4net根据日志类型写入到不同的文件中
    NUnit单元测试初试
    log4net
  • 原文地址:https://www.cnblogs.com/lovebkj/p/14075307.html
Copyright © 2011-2022 走看看