如何编写SQL分组查询以获取指定的预期结果?
如何编写SQL分组查询得到预期结果?
嘿,兄弟!要写出能精准输出你预期结果的SQL分组查询,核心得先明确你的原始表结构和预期结果的统计逻辑。我先拿一个常见的业务场景给你做演示,你可以直接套用到自己的需求上调整。
举个实际例子
假设你的原始数据表是sales,结构和样本数据如下:
| sale_id | product | category | amount | sale_date |
|---|---|---|---|---|
| 1 | 苹果 | 水果 | 100 | 2024-01-01 |
| 2 | 香蕉 | 水果 | 150 | 2024-01-01 |
| 3 | 白菜 | 蔬菜 | 80 | 2024-01-02 |
| 4 | 萝卜 | 蔬菜 | 60 | 2024-01-02 |
| 5 | 橙子 | 水果 | 120 | 2024-01-03 |
你的预期结果是按category分组,统计每个分类的总销售额和销售次数:
| category | total_amount | sale_count |
|---|---|---|
| 水果 | 370 | 3 |
| 蔬菜 | 140 | 2 |
对应的SQL分组查询就可以这么写:
SELECT category, SUM(amount) AS total_amount, -- 计算每组总销售额 COUNT(sale_id) AS sale_count -- 统计每组销售次数 FROM sales GROUP BY category; -- 按分类字段分组
关键知识点拆解(适配你的场景)
- GROUP BY子句:指定你要分组的字段,可以是单个字段,也可以是多个字段(比如同时按
category和sale_date分组),相同字段值的行会被归为一组。 - 聚合函数:分组后必须搭配聚合函数来计算每组的统计值,常用的有:
SUM():对数值字段求和COUNT():统计分组内的行数(注意COUNT(*)和COUNT(字段)的区别:前者统计所有行,后者忽略字段为NULL的行)AVG():求字段平均值MAX()/MIN():求字段的最大值/最小值
- 过滤分组结果:如果要筛选符合条件的分组,用
HAVING子句(别和WHERE搞混!WHERE是过滤原始数据,HAVING是过滤分组后的结果)。比如只想看总销售额大于200的分类:
SELECT category, SUM(amount) AS total_amount, COUNT(sale_id) AS sale_count FROM sales GROUP BY category HAVING SUM(amount) > 200; -- 筛选总销售额超过200的分组
如果你的原始表结构和预期逻辑和这个例子不一样,把原始表的字段、样本数据和预期结果的具体统计规则补充清楚,我再帮你定制精准的SQL语句!
内容的提问来源于stack exchange,提问作者Wilson Pauly
相关产品推荐
相关产品推荐

