2025年01月13日 MySQL 分组求平均时对每一组的数据进行筛选后再求平均 极客笔记
在进行数据分析和统计时,我们经常会遇到需要根据某些条件对数据进行筛选后再进行分组求平均的情况。在MySQL中,我们可以通过使用GROUP BY子句和HAVING子句来实现对每一组的数据进行筛选后再求平均值。
首先,让我们来创建一个示例数据表来模拟这种情况。假设我们有一个销售数据表sales,包含以下字段:销售ID(sales_id)、商品ID(product_id)、销售日期(sale_date)和销售金额(amount)。
CREATE TABLE sales (
sales_id INT,
product_id INT,
sale_date DATE,
amount DECIMAL(10, 2)
);
INSERT INTO sales VALUES
(1, 101, '2022-01-01', 100.00),
(2, 102, '2022-01-01', 150.00),
(3, 101, '2022-01-02', 120.00),
(4, 103, '2022-01-02', 200.00),
(5, 101, '2022-01-03', 130.00),
(6, 102, '2022-01-03', 180.00),
(7, 103, '2022-01-03', 220.00);
这里我们插入了7条销售数据,涵盖了3种商品(product_id为101、102、103)在不同日期的销售金额。
首先,我们可以使用以下SQL语句来计算每种商品的平均销售金额:
SELECT product_id, AVG(amount) AS avg_amount
FROM sales
GROUP BY product_id;
上述查询会对sales表按商品ID进行分组,并计算每组的销售金额平均值。结果如下:
product_id | avg_amount |
---|---|
101 | 116.67 |
102 | 165.00 |
103 | 210.00 |
这里我们得到了每种商品的平均销售金额。
如果我们需要针对销售日期在2022年1月1日之后的数据进行筛选后再求平均销售金额,我们可以使用以下SQL语句:
SELECT product_id, AVG(amount) AS avg_amount
FROM sales
WHERE sale_date > '2022-01-01'
GROUP BY product_id;
上述查询中,我们在WHERE子句中加入了条件sale_date > ‘2022-01-01’,表示只选择销售日期在2022年1月1日之后的数据进行计算。结果如下:
product_id | avg_amount |
---|---|
101 | 125.00 |
102 | 165.00 |
103 | 220.00 |
这里我们得到了销售日期在2022年1月1日之后的数据中每种商品的平均销售金额。
如果我们需要针对销售金额大于150的数据进行筛选后再求平均销售金额,我们可以使用以下SQL语句:
SELECT product_id, AVG(amount) AS avg_amount
FROM sales
WHERE amount > 150
GROUP BY product_id;
上述查询中,我们在WHERE子句中加入了条件amount > 150,表示只选择销售金额大于150的数据进行计算。结果如下:
product_id | avg_amount |
---|---|
102 | 165.00 |
103 | 220.00 |
这里我们得到了销售金额大于150的数据中每种商品的平均销售金额。
在实际情况中,我们可能需要对多个条件进行组合筛选后再求平均。例如,我们需要计算销售日期在2022年1月1日之后且销售金额大于150的数据中每种商品的平均销售金额:
SELECT product_id, AVG(amount) AS avg_amount
FROM sales
WHERE sale_date > '2022-01-01' AND amount > 150
GROUP BY product_id;
上述查询中,我们将两个条件sale_date > ‘2022-01-01’和amount > 150组合在一起进行筛选。结果如下:
product_id | avg_amount |
---|---|
103 | 220.00 |
这里我们得到了销售日期在2022年1月1日之后且销售金额大于150的数据中每种商品的平均销售金额。
通过使用GROUP BY子句和HAVING子句,我们可以实现对每一组的数据进行筛选后再求平均值。在实际应用中,结合条件筛选可以帮助我们更加灵活地进行数据分析和统计,得到符合需求的结果。
本文链接:http://so.lmcjl.com/news/21243/