MySQL中按月統(tǒng)計(jì)并逐月累加統(tǒng)計(jì)值的幾種實(shí)現(xiàn)寫(xiě)法
有時(shí)候,我們可能有這樣的場(chǎng)景,需要將銷量按月統(tǒng)計(jì),并且按月逐月累加。寫(xiě)慣了GROUP BY,按月統(tǒng)計(jì)倒是小case,但是逐月累加實(shí)現(xiàn)起來(lái),要稍微麻煩一點(diǎn)。下面就整理幾種寫(xiě)法,以備不時(shí)之需。
本月第一天
-- 本月第一天 SELECT DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY); -- 本月第一天 SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y-%m'), '-01');
建表及模擬數(shù)據(jù)
-- 創(chuàng)建表 CREATE TABLE `sales` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sales_date` date NOT NULL, `sales_amount` decimal(10,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入模擬數(shù)據(jù) INSERT INTO `sales` (`sales_date`, `sales_amount`) VALUES ('2023-01-01', 1500.00), ('2023-01-02', 1800.00), ('2023-01-05', 2200.00), ('2023-02-01', 1200.00), ('2023-02-03', 1800.00), ('2023-03-01', 2500.00), ('2023-03-05', 2800.00), ('2023-03-08', 3200.00), ('2023-04-01', 2100.00), ('2023-04-03', 1900.00), ('2023-04-05', 2600.00), ('2023-05-01', 3100.00), ('2023-05-02', 3400.00), ('2023-06-01', 3800.00), ('2023-06-06', 4200.00);
該表包含三個(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ì)銷售額
SELECT t1.month, t1.monthly_sales, SUM(t2.monthly_sales) AS cumulative_sales FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t1 JOIN ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t2 ON t1.month >= t2.month GROUP BY t1.month;
二、子查詢
SELECT month, monthly_sales, (SELECT SUM(monthly_sales) FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t2 WHERE t2.month <= t1.month) AS cumulative_sales FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t1;
此處使用了兩個(gè)子查詢,第一個(gè)子查詢用于獲取每個(gè)月份的總銷售額和月份,第二個(gè)子查詢用于計(jì)算累加值。在內(nèi)部子查詢中,通過(guò)<=操作符將當(dāng)前月份以及之前所有月份的銷售額相加,從而得到累加值
三、子查詢+變量
SELECT month, monthly_sales, @cumulative := @cumulative + monthly_sales AS cumulative FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t1 CROSS JOIN (SELECT @cumulative := 0) t2;
此處使用了兩個(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)月銷售額以及累加值
SELECT month, monthly_sales, (@cumulative := @cumulative + monthly_sales) AS cumulative_sales FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ORDER BY sales_date ASC ) t1, (SELECT @cumulative := 0) t2;
此處使用了兩個(gè)子查詢,第一個(gè)子查詢用于獲取每個(gè)月份的總銷售額和月份,并按銷售日期升序排序;第二個(gè)子查詢用于初始化用戶變量@cumulative。在外部查詢中,通過(guò),連接兩個(gè)子查詢,并使用用戶變量@cumulative來(lái)計(jì)算每個(gè)月份的累加值。
五、表達(dá)式(CTE)和窗口函數(shù)
使用MySQL 8.0引入的通用表表達(dá)式(CTE)和窗口函數(shù),可以將累加值計(jì)算放在CTE中完成
WITH monthly_sales AS ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) SELECT month, monthly_sales, SUM(monthly_sales) OVER (ORDER BY month) AS cumulative_sales FROM monthly_sales;
此處使用了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ì)銷售金額
##月統(tǒng)計(jì) SELECT month, monthly_sales, SUM(monthly_sales) OVER (ORDER BY month) AS cumulative_sales FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m') AS month, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY month ) t1; ##日統(tǒng)計(jì) SELECT day, monthly_sales, SUM(monthly_sales) OVER (ORDER BY day) AS cumulative_sales FROM ( SELECT DATE_FORMAT(sales_date, '%Y-%m-%d') AS day, SUM(sales_amount) AS monthly_sales FROM sales GROUP BY day ) t1;
到此這篇關(guān)于MySQL中按月統(tǒng)計(jì)并逐月累加統(tǒng)計(jì)值的幾種實(shí)現(xiàn)寫(xiě)法的文章就介紹到這了,更多相關(guān)MySQL 按月統(tǒng)計(jì)并逐月累加內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫(kù)JDBC編程詳解流程
JDBC是指Java數(shù)據(jù)庫(kù)連接,是一種標(biāo)準(zhǔn)Java應(yīng)用編程接口(?JAVA?API),用來(lái)連接?Java?編程語(yǔ)言和廣泛的數(shù)據(jù)庫(kù)。從根本上來(lái)說(shuō),JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問(wèn)到底層數(shù)據(jù)庫(kù),本篇文章我們來(lái)了解MySQL連接JDBC的流程方法2022-01-01Navicat工具中設(shè)置MySQL允許外部訪問(wèn)
默認(rèn)情況下MySQL只允許本地登錄,即只能在安裝MySQL環(huán)境所在的主機(jī)下訪問(wèn),這篇文章主要給大家介紹了關(guān)于Navicat工具中設(shè)置MySQL允許外部訪問(wèn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04MySQL?DDL執(zhí)行方式Online?DDL詳解
這篇文章主要介紹了MySQL?DDL執(zhí)行方式Online?DDL詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09