MySQL中按月統(tǒng)計(jì)并逐月累加統(tǒng)計(jì)值的幾種寫(xiě)法
有時(shí)候,我們可能有這樣的場(chǎng)景,需要將銷量按月統(tǒng)計(jì),并且按月逐月累加。寫(xiě)慣了GROUP BY,按月統(tǒng)計(jì)倒是小case,但是逐月累加實(shí)現(xiàn)起來(lái),要稍微麻煩一點(diǎn)。下面就整理幾種寫(xiě)法,以備不時(shí)之需。
建表及模擬數(shù)據(jù)
|
|
該表包含三個(gè)字段:id、sales_date、sales_amount。id為自增長(zhǎng)主鍵,sales_date為銷售日期,sales_amount為銷售額。插入了15條模擬數(shù)據(jù),涵蓋了2023年1月至6月的銷售數(shù)據(jù)
一、自連接和子查詢
首先在內(nèi)部查詢中計(jì)算出每個(gè)月份的銷售總額和月份;接著在外部查詢中使用自連接和子查詢計(jì)算每個(gè)月份的累計(jì)銷售額
|
|
二、子查詢
|
|
此處使用了兩個(gè)子查詢,第一個(gè)子查詢用于獲取每個(gè)月份的總銷售額和月份,第二個(gè)子查詢用于計(jì)算累加值。在內(nèi)部子查詢中,通過(guò)<=操作符將當(dāng)前月份以及之前所有月份的銷售額相加,從而得到累加值
三、子查詢+變量
|
|
此處使用了兩個(gè)子查詢,第一個(gè)子查詢用于獲取每個(gè)月份的總銷售額和月份,第二個(gè)子查詢用于初始化變量@cumulative。在外部查詢中,通過(guò)CROSS JOIN將兩個(gè)子查詢連接起來(lái),并且使用變量@cumulative來(lái)計(jì)算累加值。
四、用戶變量和子查詢
在內(nèi)部查詢中先對(duì)銷售日期進(jìn)行排序,然后使用用戶變量@cumulative來(lái)記錄每個(gè)月份的累加值。在最終的查詢結(jié)果中,輸出月份、當(dāng)月銷售額以及累加值
|
|
此處使用了兩個(gè)子查詢,第一個(gè)子查詢用于獲取每個(gè)月份的總銷售額和月份,并按銷售日期升序排序;第二個(gè)子查詢用于初始化用戶變量@cumulative。在外部查詢中,通過(guò),連接兩個(gè)子查詢,并使用用戶變量@cumulative來(lái)計(jì)算每個(gè)月份的累加值。
五、表達(dá)式(CTE)和窗口函數(shù)
使用MySQL 8.0引入的通用表表達(dá)式(CTE)和窗口函數(shù),可以將累加值計(jì)算放在CTE中完成
|
|
此處使用了CTE來(lái)計(jì)算每個(gè)月份的總銷售額和月份,并在外部查詢中使用窗口函數(shù)SUM() OVER()對(duì)月份進(jìn)行累加。
SUM() OVER()
使用MySQL 8.0引入的LATERAL關(guān)鍵字,以及OVER ORDER BY子句,按月份求和,再用SUM() OVER()進(jìn)行累加,并分別輸出月份、當(dāng)月銷售金額和累計(jì)銷售金額
|
|
此處使用LATERAL關(guān)鍵字和OVER ORDER BY子句對(duì)每個(gè)月份進(jìn)行分組,并計(jì)算每個(gè)月份的銷售總額和sum() over()
目前大概就知道這幾種方式,各位有沒(méi)有其他更好的方法呢?