mysql按日期分組(group by)查詢統計的時候,沒有資料補0的解決辦法
寫部落格真實個費時費力的差事,好佩服那些部落格閱讀幾十上百萬的人。今天研究了半天按照日期分組統計,沒有資料就為空了,我要讓他顯示0呀。想了辦法,都沒有找到一個好的,解決方案,然後用了一個很low的方法實現了,還是把它記錄下來。方法是用於MySQL,與開發語言無關。
1、案例中的資料結構和資料如下
2、在沒有解決的時候,是這樣的
SELECT date(downtime) AS dday, count(*) AS num FROM re_device GROUP BY dday
- 1
- 1
得到如下結果,如果那天沒有資料,那麼就會沒有記錄
我們看到,時間不連續,沒有2016-3-05這一天的,這樣本來不是問題,但是,我拿出來的資料,還要畫出圖表呀,沒有當然不行,我們需要的是下面這個樣子的。
簡單的說就是,沒有資料,就要補充一個0.
3、下面我們講實現
我們要生成一個日曆的表,然後和原來的資料,聯合查詢,說到這裡,大家就知道很low了,但是,限於我水平有限,研究這個問題,半天,這個是我找到的比較好的一種實現方式。如果你又更好的,也請你給我說下。
執行下面的sql,直接誒生成日曆的表(calendar)
CREATE TABLE num (i int);-- 建立一個表用來儲存0-9的數字
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的數字,方便以後計算時間
CREATE TABLE if not exists calendar(datelist date); -- 生成一個儲存日期的表,datalist是欄位名
-- 這裡是生成並插入日期資料
INSERT INTO calendar(datelist) SELECT
adddate(
( -- 這裡的起始日期,你可以換成當前日期
DATE_FORMAT("2016-1-1", '%Y-%m-%d')
),
numlist.id
) AS `date`
FROM
(
SELECT
n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id
FROM
num n1
CROSS JOIN num AS n10
CROSS JOIN num AS n100
CROSS JOIN num AS n1000
CROSS JOIN num AS n10000
) AS numlist;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
這裡我用了100000條記錄,算出來到2289年了,完全夠用了,到那個時候,出問題,我也管不了了。
完成之後,請刪除num的零時表
4、聯合查詢
SELECT
date(dday) ddate,
count(*) - 1 as num
FROM
(
SELECT
datelist as dday
FROM
calendar
-- 這裡是限制返回最近30天的資料
where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(datelist)&&date(datelist)<=CURDATE()
UNION ALL
SELECT
downtime
FROM
re_device
) a
GROUP BY ddate
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
好了,到這裡,基本就完成了這個查詢,出來的資料,我還是比較滿意的。
5、其他解決方法
當然,應該還有其他的解決方案,但是博主就沒有去寫了,有時間可以去寫一下。
我用的spring mvc,所以,也還是可以在Java程式碼中補充完整的,因為資料返回的是個map物件,那麼我們要遍歷這個物件,直接用calendar物件,生成日期作為key來遍歷,如果沒有資料,就put進去一個0,然後在限制一下,需要多少天的,就可以了。資料就完整了。
但是這樣也有一個問題,那就是map裡的資料順序會有問題,所以,使用的時候,也必須是生成calendar物件,然後構造出來日期作為key來遍歷。或者用Collections.sort()排序一下。
我個人覺得,還是上資料直接生成得比較好一點。
相關推薦
mysql按日期分組(group by)查詢統計的時候,沒有數據補0的解決辦法
details map對象 有一個 end creat 對象 結果 插入 數據返回 轉載自:http://blog.csdn.net/jie11447416/article/details/50887888 1、案例中的數據結構和數據如下 2、在沒有解決的時候,是這樣的
mysql按日期分組(group by)查詢統計的時候,沒有資料補0的解決辦法
寫部落格真實個費時費力的差事,好佩服那些部落格閱讀幾十上百萬的人。今天研究了半天按照日期分組統計,沒有資料就為空了,我要讓他顯示0呀。想了辦法,都沒有找到一個好的,解決方案,然後用了一個很low的方法實現了,還是把它記錄下來。方法是用於MySQL,與開發語言無關。 1、案例中的資料結構和資料如下 2、
mysql按日期分組(group by)查詢統計的時候,沒有資料補0的解決辦法。
寫部落格真實個費時費力的差事,好佩服那些部落格閱讀幾十上百萬的人。今天研究了半天按照日期分組統計,沒有資料就為空了,我要讓他顯示0呀。想了辦法,都沒有找到一個好的,解決方案,然後用了一個很low的
SQL系列(八)—— 分組(group by)
出了 常用 sql select group 數量 通過 報錯 mysql 在很多場景時,需要對數據按照某條件進行分組統計其數量、平均值等等。有這種需求,SQL自然也有解決方式。 在SQL中通過group by子句對結果按某條件進行分組。語法: select count(c
js分組(group by)
對資料進行分組,類似sql的groupBy。 原理:遍歷陣列,將符合條件的資料放在一起,最後返回一個分組後的二維陣列。 //分組 export const groupBy = (list, fn) => { const groups = {};
Linq 分組(group by)求和(sum)並且按照分隔符(join)分割列資料
var query = from c in t.AsEnumerable() group c by new { pingming = c.Field<string>("品名"),
SQL 分組(group by)
insert into test values(1,'a','甲') insert into test values(1,'a','甲') insert into test values(1,'a','甲') insert into test values(1,'a','甲') insert into tes
SQL按日期天數(即 每日)合併統計項
比如我資料庫中查詢出來,每天什麼時候有那些遊戲玩家在遊戲中的充值情況,現在我要按天來統計,看看每天有多少人充值。 表中的原資料如下: 按日期天數(即 每日)合併統計項: SELECT convert(varchar(8),[PayTime],112) AS "日期"
Mysql 分組查詢(group by)
分組查詢 1 語法 select 查詢列表 from 表 【where 篩選條件】 group by 分組的欄位【order by 排序的欄位】; 2 特點 1、和分組函式一同查詢的欄位必須是group by後出現的欄位 2、篩選分為兩類:分組前篩選和分組
MySql分組查詢(group by)並計算對應的欄位之和及兩個欄位相乘之後的和
有表如下: 需求:求出每一種商品(goods_id)的數量(goods_num)之和及單價(goods_price)乘以數量之和 sql 語句:SELECT sum(goods_pirce*goods_num) AS price_amount,sum(goods_num)
SQL Server 聚合函式與分組學習(group by)
一、SQLServer裡面的常用的五種聚合函式。 1.Sum(和)-—對於NULL值預設為0 2.MAX(最大值)MIN(最小值) 3.AVG (平均值)—不統計空值,例如存在有四個人,但是隻有三個人有成績,平均成績為:總和/3 4.COUNT(數量) --統計所有人分數總和
SQL系列四——分組(group by和having)
首先,建立資料表如下: 1、資料分組(GROUP BY): SQL中資料可以按列名分組,搭配聚合函式十分實用。 例,統計每個班的人數: SELECT student_class,COUNT(ALL student_name) AS 總人數 FROM t_stud
mysql按日期分組tp5.0和原生寫法
原生 SELECT DATE_FORMAT(create_time,'%Y-%m-%d') as date,AVG(num) as avg,MAX(num) as max FROM `on_line` WHERE server_id=2000 AND create_time>'
Leetcode演算法——49、字串分組(group anagrams)
給定一個字串陣列,將所有字串分組,每一組的字串包含的字元相同但是順序不同。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [ ["ate","eat","tea"], ["nat","tan"], ["bat
mysql按日期分組-無資料補0
參考:https://blog.csdn.net/JavaReact/article/details/79994555 eg:按天分組SELECT adddate('2019-12-01 00:00:00', numlist.id) AS 'date' FROM ( SELECT n1.i
記錄一個mysql按日期分組統計的查詢
SELECT DATE_FORMAT( deteline, "%Y-%m-%d %H" ) , COUNT( * ) FROM testGROUP BY DATE_FORMAT( deteline, "%Y-%m-%d %H" ) 查詢某天: deteline, "%Y
資料庫多表連查SQL運用Join語句和聚合語句(Group By)
現在設有簡單的表(裡面的主鍵外來鍵就不寫了): Create table Employee( EmpID int, EmpName nvarchar(10), DepID int); Create table Department( DepID int,
部分手機(如三星)的Listview列表會自動加上黑線解決辦法
部分手機(如三星)的Listview列表會自動加上黑線,這裡將其去掉部分手機(如三星)的列表會自動加上黑線。 因為三星手機會自動加上分割線。 // 部分手機(如三星C9 Pro)的設定項列表會自動加上黑線,這裡將其去掉 原因:是因為listview再三星手機上會自動加上分割線。
一張表中不同行的資料(join聯合)查詢到同一條資料中
$list = Db::query('select t.phone_number,t.group_name,t1.friend_number F1,t2.friend_number F2,(t2.friend_number-t1.friend_number) f from g
mysql獲取近7天每天資料,無資料補0
接到老大排的活,需要作出一個統計最近7天每天的資料做統計用,最終呈現出這樣的效果;圖1 因為公司庫裡面所有關於時間都是直接儲存時間戳,給我帶來了一定的處理上的難度,幸好網上