數(shù)據(jù)表中不存在的月份也要顯示,建議創(chuàng)建一個從1到12月份的表作為比對表。如果不方便創(chuàng)建月份比對表則可以用select 1到12的辦法來虛擬這個月份比對表,但是語句會有些冗長。請參考下列寫法:
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)遼中,十多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
select?months.year,months.month,?
concat(ifnull(t.sumMonthNum,'0'),
'/',months.sumYearNum)?as?`月/年比`
from?
(select?*?from?
(select?year(time)?as?year,
sum(num)?as?sumYearNum?
from?abc?group?by?year(time))?years,?
(select?1?as?month?union?all?
select?2?union?all?
select?3?union?all?
select?4?union?all?
select?5?union?all?
select?6?union?all?
select?7?union?all?
select?8?union?all?
select?9?union?all?
select?10?union?all?
select?11?union?all?
select?12)?months)?months?left?join?
(select?year(time)?as?year,
month(time)?as?month,
sum(num)?as?sumMonthNum?
from?abc?group?by?year(time),month(time))?t?
on?months.month=t.month?
order?by?months.year,months.month;
實驗截圖如下:
源表數(shù)據(jù)
SQL代碼及運行結(jié)果
比較簡單直接一點的方法就是判斷這個月份是不是1、4、7、10這4個月份的有一個,如果是,就是季度的第一個月。
判斷條件是
if 月份 in (1,4,7,10) then 實現(xiàn)。
如果你是想判斷月份是哪個季度的第一個月,用case when語句也就可以實現(xiàn)了
第一種方法用left join,?把月份顯示出來,沒有相應(yīng)月份的時候,也會顯示月份對應(yīng)的列,但是值為空
第二種方法用臨時表,建立2個字段,一個字段用來標(biāo)注月份,另外一個字段標(biāo)注統(tǒng)計值,先把12個月全部寫進(jìn)去,然后用指針對12個月進(jìn)行統(tǒng)計,把結(jié)果填入到對應(yīng)月份的統(tǒng)計結(jié)果中,如果為空就填0
?? 在統(tǒng)計數(shù)據(jù)的需求中很容易出現(xiàn)按照天來統(tǒng)計數(shù)據(jù)的場景,有時某一列的維度在那天并沒有產(chǎn)生數(shù)據(jù),但是又沒有一列是可以確保每天都是有數(shù)據(jù)的,由于mysql中并沒有fulljoin這樣的關(guān)聯(lián)方式,在這種情況下關(guān)聯(lián)查詢就有些費勁,解決的辦法也是多種多樣,畢竟條條大路通羅馬嘛,其他的就不說了,這里介紹一種相對方便的方法。
?? 產(chǎn)生一個足夠長的時間列,這個列要能夠包含想要統(tǒng)計的所有日期。這個思路的實現(xiàn)很泛,可以創(chuàng)建一個日期的臨時表,然后將想要查的日期插入,拋開創(chuàng)建表比較麻煩之外,一般在職能比較完善的公司,生產(chǎn)環(huán)境創(chuàng)建表或者修改數(shù)據(jù)是需要交給專門的DBA去操作的,各種流程。。。相對這個較簡單的一種方式就是創(chuàng)建存儲過程,然后產(chǎn)生時間列,這也是一種解決辦法。
?? 我的思路是先定義一個時間變量并初始化,然后和某個數(shù)據(jù)足夠多的表關(guān)聯(lián)查詢獲取時間列,這個表一般選取某張要查的表即可,數(shù)據(jù)條數(shù)只要超過需要查詢的條數(shù)即可,足夠即可,太多就是浪費,降低查詢效率。
?? 比如說我要查詢2018-01-10到2018-01-20每天的數(shù)據(jù),那么就可以寫成
?? 其中,cdate是我定義的一個時間變量,初始化的值是2018-01-09,因為在外面那部分執(zhí)行之后值已經(jīng)加1了,已經(jīng)不是2018-01-10了;data_t是我關(guān)聯(lián)產(chǎn)生記錄的實體表,這個表只有一個要求,就是能幫我們產(chǎn)生足夠的時間列條數(shù),后面的limit 15是幫助我產(chǎn)生15條時間記錄,可以換成其他條件;生成的t0其實就是15條全為2018-01-09的記錄,外面的查詢在每掃描一條t0的記錄就會加1天,這樣就會產(chǎn)生連續(xù)的時間列;WHERE后面是最終查詢的截止條件,換成其他的也可以。
關(guān)聯(lián)其他表舉例:
查詢從2018-01-10到當(dāng)前日期每天的統(tǒng)計數(shù)據(jù)
??通過上面的例子我想大部分人應(yīng)該可以靈活變化了,比如查詢多少天內(nèi)每天的統(tǒng)計數(shù)據(jù),某幾個月內(nèi)每月的統(tǒng)計數(shù)據(jù)等等,通過修改上面給的例子里面的sql完全可以做到,可以說這種思路就是個‘萬能模板’,希望本文能夠幫到大家。
里上圖 表 aaa, ?要按月份查找,a 出現(xiàn)的次數(shù),代碼如下
SELECT
CAST(YEAR(rq)??as?varchar)?+?'-'?+?CAST(MONTH(rq)??as??varchar)??AS??date,
count(*)??AS?'次數(shù)'
FROM?aaa
where?a="a"
GROUP?BY
CAST(YEAR(rq)??as?varchar)?+?'-'?+?CAST(MONTH(rq)??as??varchar);
結(jié)果如下圖,看看是不是你要的
select DATE_FORMAT(來電時間,'%Y-%m') as 月, 問題類別 , count(1) as 數(shù)量 from
( select 來電時間, 問題類別 from mytable where 問題類別 = '農(nóng)村用水投訴' ) tmptable
group by DATE_FORMAT(來電時間,'%Y-%m') ,問題類別 ORDER BY 月 ASC;
本文名稱:mysql+怎么統(tǒng)計月份的簡單介紹
網(wǎng)頁地址:http://www.sd-ha.com/article28/docjpcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、App開發(fā)、用戶體驗、ChatGPT、網(wǎng)站設(shè)計公司、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)