1. 程式人生 > >mysql按日期分組(group by)查詢統計的時候,沒有資料補0的解決辦法

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       因為公司庫裡面所有關於時間都是直接儲存時間戳,給我帶來了一定的處理上的難度,幸好網上