需要統計過去12個月的數據,如現在是2015年4月,那麼我們需要統計從2014年5月到2015年4月的數據情況。而這12個月中,如果這個月沒有數據的,則統計為0。
原始數據表如下圖,數據是按分鐘存儲的。也就是說要統計每個月一共有多少條body_infared大於0的數據。
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;
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