在你还没被SQL语法和变量绕晕之前,先记住:聚合函数就是你在各种统计时的好帮手。它们能帮你算总数、平均值,还有在一大堆数据里搞各种神奇操作。
聚合函数用来对一组行做数学运算。最常用的有:
SUM():算数值的总和。AVG():算平均值。COUNT():统计结果里的行数。
聚合函数在你处理大批量数据、想要快速出个简明报表时特别有用:比如有多少订单、总金额是多少、今天最大的一笔订单是多少。 咱们来看看几个聚合函数的例子。
统计行数:COUNT()函数
COUNT()函数可以帮你统计表里的行数。下面举几个例子说明它怎么用。
-- 统计订单表里所有行
SELECT COUNT(*) AS total_orders
FROM orders;
-- 统计不同客户的数量
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM orders;
-- 统计金额大于100的订单数
SELECT COUNT(*) AS high_value_orders
FROM orders
WHERE total_amount > 100;
COUNT()经常用来统计记录数、唯一值数量,也常和过滤条件一起用,比如“有多少学生报名了Python课程”。
数据求和:SUM()函数
SUM()函数用来算某一列的总和。比如我们来算一下所有客户的购买总额。
-- 统计总收入
SELECT SUM(total_amount) AS total_revenue
FROM orders;
-- 某个客户的总消费
SELECT SUM(total_amount) AS customer_spending
FROM orders
WHERE customer_id = 101;
-- 按类别统计订单总额
SELECT category, SUM(total_amount) AS category_revenue
FROM orders
GROUP BY category;
SUM()是分析销售、收入和各种总额的主力工具。比如你想知道上个月写字楼的收入?用它就对了。
平均值:AVG()函数
AVG()函数帮你算一组数据的平均值。比如学生的平均分,或者客户的平均订单金额。
-- 订单的平均金额
SELECT AVG(total_amount) AS average_order_value
FROM orders;
-- 按类别统计订单平均金额
SELECT category, AVG(total_amount) AS average_order_value
FROM orders
GROUP BY category;
-- 最近7天客户的平均订单金额
SELECT AVG(total_amount) AS avg_check_last_week
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
平均值在分析服务质量、发现异常、算关键指标(比如每个客户的平均利润)时很有用。
聚合函数在分析中的用法
现在我们已经熟悉了这些基础函数,来看看怎么用它们做基础分析报表。
例1:总收入和订单数量
比如你想知道某个月有多少订单,总收入是多少。
SELECT
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue
FROM orders
WHERE order_date >= '2023-10-01' AND order_date <= '2023-10-31';
例2:按类别统计平均收入
如果你想把收入按商品类别分开统计呢?
SELECT
category,
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS avg_order_value
FROM orders
GROUP BY category;
例3:最近7天的订单
经常需要分析短时间内的数据,比如最近一周的情况。
SELECT
COUNT(*) AS orders_last_week,
SUM(total_amount) AS revenue_last_week,
AVG(total_amount) AS avg_check_last_week
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
实战案例和具体任务
任务:按地区分析销售
假如你是连锁店老板,想分析各地区的收入分布。
SELECT
region,
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS average_order_value
FROM orders
GROUP BY region
ORDER BY total_revenue DESC;
任务:收入前10的客户
现在我们加点逻辑,找出总订单金额最多的前10个客户。
SELECT
customer_id,
SUM(total_amount) AS total_spending
FROM orders
GROUP BY customer_id
ORDER BY total_spending DESC
LIMIT 10;
任务:按星期几对比收入
想知道你生意哪天最赚钱?看这个例子:
SELECT
TO_CHAR(order_date, 'Day') AS day_of_week,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS avg_order_value
FROM orders
GROUP BY TO_CHAR(order_date, 'Day')
ORDER BY total_revenue DESC;
GO TO FULL VERSION