在数据库查询中,聚合函数用于对一组值执行计算并返回单个值。常见的聚合函数包括 SUM、AVG、COUNT、MAX 和 MIN。有时,您可能需要在一个查询中结合使用多个聚合函数来获取更复杂的信息。以下是如何在 SQL 查询中结合使用多个聚合函数的详细说明和示例。
GROUP BY 子句用于根据一个或多个列对结果集进行分组,以便对每个组应用聚合函数。
HAVING 子句用于过滤聚合后的结果,类似于 WHERE 子句,但作用于聚合函数的结果。
假设有一个名为 sales 的表,结构如下:
| sale_id | product_id | quantity | price | sale_date |
|---|---|---|---|---|
| 1 | A | 2 | 10.00 | 2023-01-01 |
| 2 | B | 1 | 20.00 | 2023-01-01 |
| 3 | A | 1 | 10.00 | 2023-01-02 |
| 4 | C | 5 | 5.00 | 2023-01-02 |
| 5 | B | 3 | 20.00 | 2023-01-03 |
SELECT
product_id,
SUM(quantity * price) AS total_sales,
AVG(quantity) AS average_quantity,
COUNT(*) AS total_records
FROM
sales
GROUP BY
product_id;
结果:
| product_id | total_sales | average_quantity | total_records |
|---|---|---|---|
| A | 30.00 | 1.5 | 2 |
| B | 80.00 | 2.0 | 2 |
| C | 25.00 | 5.0 | 1 |
SELECT
sale_date,
SUM(quantity * price) AS daily_total_sales,
AVG(quantity * price) AS average_transaction_amount
FROM
sales
GROUP BY
sale_date;
结果:
| sale_date | daily_total_sales | average_transaction_amount |
|---|---|---|
| 2023-01-01 | 40.00 | 20.00 |
| 2023-01-02 | 75.00 | 15.00 |
| 2023-01-03 | 20.00 | 20.00 |
假设我们想找出销售记录数大于等于 2 且平均销售数量小于 3 的产品:
SELECT
product_id,
COUNT(*) AS total_records,
AVG(quantity) AS average_quantity
FROM
sales
GROUP BY
product_id
HAVING
COUNT(*) >= 2
AND AVG(quantity) < 3;
结果:
| product_id | total_records | average_quantity |
|---|---|---|
| A | 2 | 1.5 |
假设我们想获取每个产品的总销售额、平均销售数量、最高单笔销售额以及最低单笔销售额:
SELECT
product_id,
SUM(quantity * price) AS total_sales,
AVG(quantity) AS average_quantity,
MAX(quantity * price) AS max_single_sale,
MIN(quantity * price) AS min_single_sale
FROM
sales
GROUP BY
product_id;
结果:
| product_id | total_sales | average_quantity | max_single_sale | min_single_sale |
|---|---|---|---|---|
| A | 30.00 | 1.5 | 10.00 | 10.00 |
| B | 80.00 | 2.0 | 20.00 | 20.00 |
| C | 25.00 | 5.0 | 25.00 | 25.00 |
有时,您可能需要在聚合查询的基础上进一步筛选或计算。这时可以使用子查询。
示例:找出总销售额最高的产品
SELECT
product_id,
total_sales
FROM (
SELECT
product_id,
SUM(quantity * price) AS total_sales
FROM
sales
GROUP BY
product_id
) AS sales_summary
WHERE
total_sales = (SELECT MAX(total_sales) FROM sales_summary);
结果:
| product_id | total_sales |
|---|---|
| B | 80.00 |
CASE 语句可以在聚合过程中进行条件计算。
示例:按类别分组,计算每个类别的总销售额和平均销售额,并标记高销售额类别
假设 sales 表新增了 category 列:
| sale_id | product_id | quantity | price | sale_date | category |
|---|---|---|---|---|---|
| 1 | A | 2 | 10.00 | 2023-01-01 | X |
| 2 | B | 1 | 20.00 | 2023-01-01 | Y |
| … | … | … | … | … | … |
SELECT
category,
SUM(quantity * price) AS total_sales,
AVG(quantity * price) AS average_sales,
CASE
WHEN SUM(quantity * price) > 50 THEN '高销售额'
ELSE '正常销售额'
END AS sales_level
FROM
sales
GROUP BY
category;
结果:
| category | total_sales | average_sales | sales_level |
|---|---|---|---|
| X | 50.00 | 25.00 | 正常销售额 |
| Y | 80.00 | 20.00 | 高销售额 |
GROUP BY 子句中。WHERE 在分组前过滤数据,而 HAVING 在分组后过滤聚合结果。结合多个聚合函数可以在一个查询中提供丰富的分析结果。通过合理使用 GROUP BY、HAVING 以及子查询等手段,您可以执行复杂的数据库查询以满足各种业务需求。确保理解每个聚合函数的作用及其适用场景,并注意查询的性能和可读性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。