1. 程式人生 > >sql統計某商品最近12個月的銷量,缺銷售資料的月份自動補0

sql統計某商品最近12個月的銷量,缺銷售資料的月份自動補0

今天遇到這樣一個問題,要統計某商品最近12個月的銷量,輸出到UI畫個柱狀圖

sql長這樣子:

select date_format(date, '%Y-%m') as month, sum(money) as totalmoney from sales where code='1200040' and date>date_add(last_day(date_sub(curdate(), interval 1 year)), interval 1 day) group by date_format(date, '%Y-%m')

其中date_add(last_day(date_sub(curdate(), interval 1 year)), interval 1 day)是算出12個月前的1號,
比如今天是2018-09-16,則算出的結果是2017-10-01。這樣2017-10到2018-09一共12個月


問題來了,有些商品在有些月份就沒有銷售,上面sql取出來就沒有12條。需要補全12條。

思路:先把12個月弄出來,再left join上面的sql

把12個月弄出來的sql如下:

select date_format(date_sub(curdate(), interval t.count month), '%Y-%m') as month from 
(
select @counter:[email protected]+1 as count from sales, (select @counter:=-1) as t limit 12
) as t

解釋:內層sql就是隨便拿個表,取12行,再用計數器得到1到12,外層sql是用當前日期減對應的月份數,再格式化成%Y-%m


再把兩個sql用left join連起來就行了,最終的sql如下:

select a.month, case when b.totalmoney is null then 0.0 else b.totalmoney end as totalmoney from 
(
select date_format(date_sub(curdate(), interval t.count month), '%Y-%m') as month from 
(
select @counter:[email protected]+1 as count from sales, (select @counter:=-1) as t limit 12
) as t
) as a left join 
(
select date_format(date, '%Y-%m') as month, sum(money) as totalmoney from sales where code='1200040' and date>date_add(last_day(date_sub(curdate(), interval 1 year)), interval 1 day) group by date_format(date, '%Y-%m')
) as b on a.month=b.month order by a.month

裡面的case when是用來把為null的值變成0.0

這個方案有個缺點是要藉助一個至少有12行的表來產生出12個月份。不知道有沒有更好的方案直接可以憑空產生出12行來。有解決辦法的同學歡迎留言!

相關推薦

sql統計商品最近12銷量銷售資料月份自動0

今天遇到這樣一個問題,要統計某商品最近12個月的銷量,輸出到UI畫個柱狀圖 sql長這樣子: select date_format(date, '%Y-%m') as month, sum(money) as totalmoney from sales where cod

Oracle統計一年中的1-12的數據總和

頁面 數據 into padding ber index load from html 查詢2015年1月到12個月的所有實有人口數量和往年2014年1月到12個月的實有人口數量,沒有的月份顯示 人口數量為0.類似效果如圖 創建表 ? 1 2 3 4 5

MYSQL語句一年內12列引數統計顯示

select   sum(case month(a.GOODSDATE) when '1' then a.GOODSACTUALPRICE else 0 end) as 一月份,  sum(case month(a.GOODSDATE) when '2' then a.GOODSACTUALPRICE els

mysql 根據一年 查詢12資料

1、時間欄位是datetime型別 2、需要用到中間表,表結構和資料鏈接下載 https://pan.baidu.com/s/1sAQ78e3Ao-KwvYJlaipbKQ 3、前兩個 adddate 月日需要在資料庫寫死 從每年的-01-01開始,-最後一個日期同理xxxx-12-31 4、下面是s

mysql 根據一年 查詢12的數據

ima .com 數據 and datetime mon etime baidu try 1、時間字段是datetime類型 2、需要用到中間表,表結構和數據鏈接下載 https://pan.baidu.com/s/1sAQ78e3Ao-KwvYJlaipbKQ 3、前兩個

MySql 統計最近 6 內的資料沒有資料預設為顯示為 0

在做報表資料統計的時候,用一個折線圖用來顯示並統計最近 6 個月內的資料結算情況。為了前端小夥伴方便處理資料,需要將沒有資料的月份預設填充為 0。 網上查了很久,最終找到了解決辦法,寫出來分享一下,希

MySQL獲取近12資料SQL

##獲取近12個月資料 SELECT TYEAR,        TMONTH,        CONCAT(SUBSTRING(TYEAR,3),'/',TMONTH) AS T_TIME,     

MySQL統計過去12資料沒有則為0

查詢每月新增使用者數celsp_users是使用者表 createTime 為新增使用者時間 SELECT a.count,b.time2 from   (select count(c.createTime) as count,FROM_UNIXTIME( UNIX_TI

SpinalCyte宣佈注射CybroCell™後MRI轉歸可維持12

資料顯示,一些有臨床意義的終點獲得顯著改善   休斯敦 -- (美國商業資訊) -- SpinalCyte, LLC是一家總部位於美國德州的再生醫學公司,專注於採用其通用型供體產品CybroCell™再造椎間盤髓核,該公司今天宣佈,椎間盤退行性變(DDD)患者接受改性人類面板成纖維細胞

php獲取12內的開始時間和結束時間

$currentTime = time(); $cyear = floor(date("Y",$currentTime)); $cMonth = floor(date("m",$currentTime)); for($i=0;$i<6;$i++){ $nMonth = $cMonth-$i

按結束日期往前推30天1212獲取資料齊缺失的資料

public List<Integer> getThirtyDates() { List<Integer> weeks = new ArrayList<Integer>(); long endTime = LDateTime.getTime(LDa

最近區塊鏈學習的總結

什麼是區塊鏈? 比特幣   一提起區塊鏈,100百個人裡面可能有99個會提到比特幣,有人甚至認為區塊鏈就是加密數字貨幣,這其實是對區塊鏈的一種誤解。區塊鏈技術來源於比特幣。比特幣由中本聰於2008年提出,其目的在於構建完全通過對等技術實現的電子現金系統,中間不需要任何金融機構。中介金

無需信用卡免費擼12的雲伺服器VPS

SkySilk送10美刀〜之前需要綁信用卡,這次直接幫寶就送~VPS最低1美美刀一個月!可以用12個月〜 註冊必須走AFF,否則不送10美刀〜隨時可能黃,速度上車〜   溫馨提示:走邀請連結才有得送噢~~~​   ① 註冊地址:https://www.skysilk.com/re

Python得到前面12資料Python得到現在時間 前一年的資料

#Python 實現得到現在時間12個月前的每個月 # 假設現在的時間是2016年9月25日 #得到現在的時間 得到now等於2016年9月25日 now = datetime.datetime.now() #得到今年的的時間 (年份) 得到的today_year等於2

JS根據搜尋日期往前推12

mathDate(search){ console.log(search,"時間"); var date = new Date(), m = '';

Oracle根據當前時間獲取最近5年最近6最近30天的時間

根據當前時間獲取最近5年時間:(yyyy) SELECT to_char(SYSDATE,'YYYY') - LEVEL + 1 as "xAxisValue"  FROM dualCONNECT BY LEVEL <= 5ORDER BY to_char(SYSDA

SQL 日期計算 加減3

select getdate()+CAST('1900-04-03' as DATETIME)   select getdate()-CAST('1900-04-03' as DATETIME) 正確寫法: select DATEADD(month, 3, GETDATE()

李彥宏收到無人車罰單的四北京自動駕駛新規終於出臺!

無人駕駛 阿波羅 新規 中國自動駕駛相關法律法規的空白終於被打破了,就在今天,北京市交通委發布了相關指導文件,符合規定的自動駕駛汽車,終於可以正式上路了。而媒體們在轉載這條消息時,都要cue一下前腳上路,後腳吃罰單的李彥宏。四個月前百度在AI開發者大會上,李彥宏乘著自動駕駛汽車從五環趕往現場,結果

紫光雲三上線背後是一個怎樣的布局?

開發測試 同時 雲解決方案 物聯網 綜合 國際 登陸 生產 準確率 2018年3月30日,紫光集團重磅發布了“紫光雲戰略”,宣布投資120億元進軍公有雲市場。三個月後的7月10日,紫光集團宣布,華北與西南地區的三個大區節點建設及內測如期完成,紫光公有雲上線試商用。紫光雲首期

畢業快4小總結!

       今年6月份畢業,直接奔向了北京,成了一名北漂,母校是一所浙江舟山的高校,浙江海洋大學,之前是浙江海洋學院,在我大三的時候,改名為浙江海洋大學,在我大四畢業的時候,校長因為XX被抓了,悲劇,連我的畢業證和學位證上的簽名都沒有校長的名字,