MySQL GROUP_CONCAT 组内排序与数据聚合的实用笔记
整理 GROUP_CONCAT 排序、去重、分隔符和长度限制等实际使用细节。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-20 12:00:46 SQL 数据库 数据查询
写业务统计 SQL 时,GROUP BY 配 CASE WHEN 是很常用的组合。不少需要分类聚合的需求,靠这俩就能直接出结果,不用套多层子查询绕来绕去。
拿常见的销售表举个例子,表名 Sales,字段有 SaleID(销售ID)、Store(店铺)、Employee(员工)、Amount(销售额)、SaleDate(销售日期)。现在要按店铺和员工两个维度分组,分别算出单笔大于 500 的销售额总和,以及单笔小于等于 500 的销售额总和。
直接在聚合函数里嵌 CASE WHEN 就行,写法如下:
SELECT
Store,
Employee,
SUM(CASE WHEN Amount > 500 THEN Amount ELSE 0 END) AS HighSales,
SUM(CASE WHEN Amount <= 500 THEN Amount ELSE 0 END) AS LowSales
FROM Sales
GROUP BY Store, Employee;
语句里两个 SUM 分别对应两类金额统计:符合条件就累加对应的销售额,不符合就加 0,最后给结果列起个别名。
GROUP BY 后面跟上店铺和员工两个字段,最终结果就会按这两个维度,聚合出对应的高低销售额数值。
具体选哪个聚合函数来搭配 CASE WHEN,完全看实际的业务需求,没有固定标准。常用的就那几个:COUNT 用来统计符合条件的行数,SUM 对数值列做累加,AVG 计算平均值,MAX 和 MIN 分别取分组内的最大值和最小值。
这几个基本能覆盖绝大多数日常统计场景。
很多人写的时候会纠结不同聚合函数的性能差异,其实没必要。
查询的实际执行效率,更多和数据库优化器的策略、索引有没有命中、数据量大小,以及整个查询的复杂度有关。绝大多数场景下,优化器会自动生成合理的执行计划,聚合函数本身带来的性能差别微乎其微。
这类写法其实就是把条件判断下沉到聚合步骤里,一次分组就能输出多列统计结果。
写的时候注意条件分支的边界值别写错,SELECT 里的非聚合字段和 GROUP BY 后面的字段对应好,再配合上合适的索引,基本就能满足大部分分类统计需求了。
上一篇: 纯CSS实现四种旋转加载效果
整理 GROUP_CONCAT 排序、去重、分隔符和长度限制等实际使用细节。
遇到 SQLite 删除主表记录时报外键约束失败,整理了几种处理方式,包括手动删子表、建表时开级联,以及重建表加外键的步骤。
还在为SQL `ORDER BY` 子句报错“在应使用条件的上下文指定了非布尔类型的表达式”而困扰吗?本文深入剖析了这一常见错误的原因,包括错误的列名、函数使用不当、括号匹配问题及子查询滥用。提供清晰的修正路径,助你轻松掌握SQL排序奥秘。
本文深入探讨SQL表创建语句的格式化技巧,包括如何通过字段对齐、选项分段和清晰注释,有效提升代码的可读性与可维护性。我们还将强调数据库兼容性与选项适用性,助你编写出整洁、高效且易于团队协作的SQL代码。
你的DELETE操作是否常常导致数据库卡顿?本文揭示MySQL与SQL Server中DELETE语句的性能瓶颈,并提供一套行之有效的优化方案。学习如何巧妙利用索引、进行分批删除、避免全表扫描,以及正确使用TRUNCATE与事务管理,让你从容应对大数据删除挑战,显著提升数据库响应速度。