程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL統計過去12個月的數據(包括本月)

MySQL統計過去12個月的數據(包括本月)

編輯:MySQL綜合教程

MySQL統計過去12個月的數據(包括本月)


1、問題

需要統計過去12個月的數據,如現在是2015年4月,那麼我們需要統計從2014年5月到2015年4月的數據情況。而這12個月中,如果這個月沒有數據的,則統計為0。

原始數據表如下圖,數據是按分鐘存儲的。也就是說要統計每個月一共有多少條body_infared大於0的數據。

原始數據

2、處理過程

2.1 獲取12個月到現在的數據

select * from device_data t where 
DATE_FORMAT(t.time,'%Y-%m')>
DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m');

2.2 統計某台設備在過去12個月中每個月body_infared大於0的數據之和。

select DATE_FORMAT(t.time,'%Y-%m') month,count(t.id) minute from device_data t
where t.body_infrared>0 and t.device_id=13 
AND  DATE_FORMAT(time,'%Y-%m')>
DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m')
 group by device_id,month

獲取結果:

分析結果

這時候我們發現,原始數據中只有三個月的數據,還有其它9個月按要求應該是顯示為0的。

2.3 用一個笨點的方法獲取過去12個月所有的月份。
創建一個查找過去12個月的視圖,當然這裡你也可以使用存儲過程遍歷地把12個月插入到一個臨時表中,代碼會更優雅一點。

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`%` 
    SQL SECURITY DEFINER
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;

過去12個月

2.4 把2.3的12個月的顯示數據與 2.2查詢結果關聯查詢<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCgoKPHByZSBjbGFzcz0="brush:sql;">select v.month,ifnull(b.minute,0) minute from past_12_month_view v left join (select DATE_FORMAT(t.time,'%Y-%m') month,count(t.id) minute from device_data t where DATE_FORMAT(t.time,'%Y-%m')> DATE_FORMAT(date_sub(curdate(), interval 12 month),'%Y-%m') and t.device_id=(select d.id from device d where d.serial='01150100004') group by t.device_id,month)b on v.month = b.month group by v.month

最後得到我們想要的結果:

最終結果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved