-- 按区域统计销售额和订单数
SELECT
region,
COUNT(*) as order_count,
SUM(amount) as total_sales,
AVG(amount) as avg_sales
FROM sales
GROUP BY region
ORDER BY total_sales DESC;
结果说明:
region
order_count
total_sales
avg_sales
East
3
18000
6000
West
2
7500
3750
South
2
11000
5500
⚠️ 注意:
SELECT
SELECT
中未出现在聚合函数中的列,必须包含在
GROUP BY
GROUP BY
中。
过滤聚合结果
使用
HAVING
HAVING
子句过滤分组后的结果,替代无法在
WHERE
WHERE
中使用的聚合条件。
-- 查询总销售额大于 10000 的区域
SELECT
region,
SUM(amount) as total_sales
FROM sales
GROUP BY region
HAVING SUM(amount) > 10000
ORDER BY total_sales DESC;
结果说明:
region
total_sales
East
18000
South
11000
WHERE 与 HAVING 的区别
WHERE
WHERE
在分组前过滤行,不能使用聚合函数。
HAVING
HAVING
在分组后过滤组,可以使用聚合函数。
-- 正确:先过滤日期,再分组
SELECT region, SUM(amount) as total_sales
FROM sales
WHERE sale_date >= '2024-06-02'
GROUP BY region
HAVING SUM(amount) > 5000;
条件聚合
使用
CASE WHEN
CASE WHEN
配合聚合函数,实现条件统计,避免多次扫描表。
-- 按区域统计各类产品的销售额
SELECT
region,
SUM(CASE WHEN product = 'Phone' THEN amount ELSE 0 END) as phone_sales,
SUM(CASE WHEN product = 'Laptop' THEN amount ELSE 0 END) as laptop_sales,
SUM(CASE WHEN product = 'Tablet' THEN amount ELSE 0 END) as tablet_sales,
SUM(amount) as total_sales
FROM sales
GROUP BY region
ORDER BY region;
结果说明:
region
phone_sales
laptop_sales
tablet_sales
total_sales
East
10000
8000
0
18000
South
0
8000
3000
11000
West
4500
0
3000
7500
💡 提示:条件聚合比多次
SELECT
SELECT
+
UNION
UNION
更高效,推荐用于行转列场景。
去重计数
统计唯一值数量时,使用
COUNT(DISTINCT col)
COUNT(DISTINCT col)
。
-- 统计各区域销售的产品种类数
SELECT
region,
COUNT(DISTINCT product) as unique_products,
SUM(quantity) as total_quantity
FROM sales
GROUP BY region
ORDER BY unique_products DESC;
-- 使用近似去重计数(适合千万级以上数据)
SELECT
region,
APPROX_COUNT_DISTINCT(product) as approx_unique_products,
COUNT(DISTINCT product) as exact_unique_products
FROM sales
GROUP BY region;