1. 程式人生 > 資料庫 >MySQL 統計某張表過去12個月的資料(包括本月)

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
;

參考原文:

以上。