当前位置: 首页 > news >正文

SQLSERVER分组

在 SQL Server 中,分组(Grouping) 主要通过 GROUP BY 子句实现,用于将结果集按一个或多个列的值进行 “分组”,并对每个分组应用聚合函数(如 COUNTSUMAVG 等)进行统计分析。分组是处理 “按类别汇总数据” 的核心手段(如 “按部门统计员工数量”“按地区汇总销售额” 等)。

一、基本语法与核心逻辑

GROUP BY 的核心逻辑是:将列值相同的行归为一组,然后对每组计算聚合结果

1. 基础语法
SELECT 分组列1, 分组列2..., 聚合函数(列名) AS 别名
FROM 表名
WHERE 行筛选条件  -- 分组前筛选行
GROUP BY 分组列1, 分组列2...  -- 按指定列分组
[HAVING 分组筛选条件];  -- 分组后筛选分组结果
2. 关键规则
  • SELECT 列表中非聚合函数的列,必须全部出现在 GROUP BY 中(否则会报错)。

  • 分组后的数据顺序不确定,如需排序需加 ORDER BY

二、常用场景与示例

假设存在 Sales 表(销售记录),结构如下:

order_idproductregionamountsale_date
1手机华北30002023-01-01
2电脑华北50002023-01-02
3手机华东30002023-01-03
4电脑华东50002023-01-04
5手机华北30002023-01-05
1. 按单个列分组

需求:按 region(地区)分组,统计每个地区的总销售额(amount 总和)。

SELECT region,  -- 分组列,必须出现在 GROUP BY 中SUM(amount) AS total_amount  -- 聚合函数:计算每组的总销售额
FROM Sales
GROUP BY region;  -- 按地区分组

结果

regiontotal_amount
华北11000(3000+5000+3000)
华东8000(3000+5000)
2. 按多个列分组

需求:按 region(地区)和 product(产品)分组,统计每个地区每种产品的销售次数(订单数)和平均销售额。

SELECT region, product,  -- 多列分组:先按地区分,同地区内再按产品分COUNT(order_id) AS order_count,  -- 统计订单数AVG(amount) AS avg_amount  -- 计算平均销售额
FROM Sales
GROUP BY region, product  -- 多列分组,顺序不影响结果(但建议按逻辑顺序)
ORDER BY region, product;  -- 按分组列排序

结果

regionproductorder_countavg_amount
华北手机23000(2 次订单,金额都是 3000)
华北电脑15000(1 次订单)
华东手机13000
华东电脑15000
3. 用 HAVING 筛选分组结果

WHERE 用于分组筛选行,HAVING 用于分组筛选分组(只能跟在 GROUP BY 后,可使用聚合函数)。

需求:筛选出 “总销售额超过 8000” 的地区。

SELECT region,SUM(amount) AS total_amount
FROM Sales
GROUP BY region
HAVING SUM(amount) > 8000;  -- 分组后筛选:总销售额>8000

结果

regiontotal_amount
华北11000(只有华北地区满足条件)
4. 结合 WHEREHAVING

需求:先筛选出 “2023 年 1 月 1 日后的销售记录”,再按地区分组,统计总销售额,并筛选出总销售额超过 5000 的地区。

SELECT region,SUM(amount) AS total_amount
FROM Sales
WHERE sale_date > '2023-01-01'  -- 先筛选行:只保留1月1日后的记录
GROUP BY region
HAVING SUM(amount) > 5000;  -- 再筛选分组:总销售额>5000

结果

regiontotal_amount
华北8000(1 月 2 日电脑 5000 + 1 月 5 日手机 3000)
华东8000(1 月 3 日手机 3000 + 1 月 4 日电脑 5000)

三、常见聚合函数

分组查询中常用的聚合函数如下:

函数作用示例(基于上述 Sales 表)
COUNT()统计分组内的行数COUNT(*) 统计所有行;COUNT(amount) 统计非 NULL 的 amount 行数
SUM()计算列值总和(仅数值型)SUM(amount) 计算总销售额
AVG()计算列值平均值(仅数值型)AVG(amount) 计算平均销售额
MAX()取分组内列的最大值MAX(amount) 取每组最大销售额
MIN()取分组内列的最小值MIN(amount) 取每组最小销售额

四、注意事项

  1. SELECTGROUP BY 的对应关系SELECT 中所有非聚合函数的列必须出现在 GROUP BY 中,否则会报错。例如:

    -- 错误示例:product 未在 GROUP BY 中,但出现在 SELECT 中(且非聚合)
    SELECT region, product, SUM(amount) 
    FROM Sales 
    GROUP BY region;  -- 报错:product 不在 GROUP BY 中
  2. WHEREHAVING 的区别

    • WHERE:在分组前筛选行,不能使用聚合函数(如 WHERE SUM(amount) > 1000 是错误的)。

    • HAVING:在分组后筛选分组,可以使用聚合函数(如 HAVING SUM(amount) > 1000 是正确的)。

  3. 空值(NULL)的处理: 分组时,NULL 会被视为 “相同值” 归为一组(即所有 NULL 行会被分到同一组)。

  4. 性能优化: 对 GROUP BY 的列创建索引(如 CREATE INDEX IX_Sales_Region ON Sales(region)),可减少分组时的排序开销,提升性能。

总结

GROUP BY 是 SQL Server 中按类别汇总数据的核心工具,其核心流程是: 筛选行(WHERE)→ 按列分组(GROUP BY)→ 聚合计算 → 筛选分组(HAVING)→ 排序(ORDER BY。 使用时需注意 SELECTGROUP BY 的列对应关系,以及 WHEREHAVING 的适用场景。

http://www.xdnf.cn/news/1403983.html

相关文章:

  • Cocos游戏中自定义按钮组件(BtnEventComponent)的详细分析与实现
  • 由于不对称GND过孔配置,差分信号过孔上的差模到共模转换
  • 线程池项目代码细节2
  • 【树形数据结构】李超线段树 (Li-Chao Tree)
  • vscode新建终端默认不是cmd问题
  • sunset: sunrise
  • CCS自定义函数.h与.c问题解决办法
  • “HEU-AUTO”无线上网使用指南
  • 【多项式】快速沃尔什变换 (FWT)
  • SpringCloud Alibaba微服务--Sentinel的使用
  • 【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要
  • 2025年- H102-Lc210--3658.奇数和与偶数和的最大公约数(gcd最大公约数)--Java版
  • 【Linux基础】深入理解Linux环境下的BIOS机制
  • PostgreSQL:突破关系型数据库的边界
  • AI公司是怎样对权重和损失函数做处理的?
  • nacos3端口漂移问题
  • mysql的内置函数
  • 论《运动战》
  • 个性化导航新体验:cpolar让Dashy支持语音控制
  • Tomcat 企业级运维实战系列(四):Tomcat 企业级监控
  • 数值分析——数据误差对函数值的影响
  • nacos 2.5.1 心跳源码解析
  • 基于单片机商用电子计价秤电子秤系统Proteus仿真(含全部资料)
  • 图解LLM(AI大模型)的工作原理
  • Redis 测试:过期 key 内存释放情况
  • 深入理解shared_ptr与循环引用问题
  • node.js ---文件读写(FS模块)
  • 用【Coze】实现文案提取+创作
  • 蓓韵安禧活性叶酸独立包装日期标注
  • 加密软件哪个好用?加密软件-为数据共享提供安全保障