自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL中按月統(tǒng)計(jì)并逐月累加統(tǒng)計(jì)值的幾種寫(xiě)法

數(shù)據(jù)庫(kù) MySQL
id、sales_date、sales_amount。id為自增長(zhǎng)主鍵,sales_date為銷售日期,sales_amount為銷售額。插入了15條模擬數(shù)據(jù),涵蓋了2023年1月至6月的銷售數(shù)據(jù)

有時(shí)候,我們可能有這樣的場(chǎng)景,需要將銷量按月統(tǒng)計(jì),并且按月逐月累加。寫(xiě)慣了GROUP BY,按月統(tǒng)計(jì)倒是小case,但是逐月累加實(shí)現(xiàn)起來(lái),要稍微麻煩一點(diǎn)。下面就整理幾種寫(xiě)法,以備不時(shí)之需。

建表及模擬數(shù)據(jù)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25



-- 創(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ì)銷售額


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15



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;


二、子查詢


1
2
3
4
5
6
7
8
9
10
11
12
13



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)前月份以及之前所有月份的銷售額相加,從而得到累加值

三、子查詢+變量


1
2
3
4
5
6
7



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)月銷售額以及累加值


1
2
3
4
5
6
7
8
9



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中完成


1
2
3
4
5
6
7
8
9



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ì)銷售金額


1
2
3
4
5
6
7
8



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;


此處使用LATERAL關(guān)鍵字和OVER ORDER BY子句對(duì)每個(gè)月份進(jìn)行分組,并計(jì)算每個(gè)月份的銷售總額和sum() over()

目前大概就知道這幾種方式,各位有沒(méi)有其他更好的方法呢?

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-06-08 11:42:12

Pandas數(shù)據(jù)分析Python

2020-12-08 09:45:07

MySQL數(shù)據(jù)庫(kù)索引

2015-07-23 16:42:38

SQL Server自增長(zhǎng)鍵列值

2022-12-13 10:05:13

MySQL數(shù)據(jù)庫(kù)

2018-09-19 16:15:18

MySQL直方圖數(shù)據(jù)庫(kù)

2010-06-13 15:00:23

MySQL統(tǒng)計(jì)函數(shù)

2009-06-18 09:05:35

Unix文件管理

2021-02-27 09:28:09

數(shù)據(jù)科學(xué)數(shù)據(jù)

2009-05-12 13:10:22

OracleMySQLSELECT

2014-08-12 15:03:57

大數(shù)據(jù)

2015-08-19 09:40:51

統(tǒng)計(jì)分析

2023-11-13 16:49:51

C++單例

2023-12-08 07:55:37

MySQL數(shù)據(jù)統(tǒng)計(jì)InnoDB

2014-01-22 11:04:51

Linux流量監(jiān)控

2010-09-14 17:27:27

SQL函數(shù)

2025-02-04 09:58:08

2015-10-22 10:54:24

小數(shù)據(jù)統(tǒng)計(jì)

2017-06-02 10:58:00

統(tǒng)計(jì)語(yǔ)言模型

2015-10-29 09:56:23

小數(shù)據(jù)大數(shù)據(jù)統(tǒng)計(jì)學(xué)

2010-05-14 18:16:44

MySQL統(tǒng)計(jì)函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)