SQL 实战-巧用 CASE WHEN 实现条件分组与统计

server/2024/12/25 9:37:14/

在 SQL 查询中,CASE WHEN 是一个非常强大的条件表达式,能够灵活地实现复杂的分组、统计、分类汇总等功能。尤其在进行报表开发或数据分析时,CASE WHEN 可以帮助我们轻松实现条件分组统计,而不必依赖多次查询或编写复杂的存储过程。

本文将通过实际案例,展示如何巧妙使用 CASE WHEN 实现条件分组与统计。


一、CASE WHEN 基本语法

sql">CASE  WHEN 条件1 THEN 结果1  WHEN 条件2 THEN 结果2  ELSE 默认结果  
END  

特点

  • 可以嵌套在 SELECTWHEREGROUP BYHAVING 等语句中。
  • CASE 语句可以根据不同的条件返回不同的结果,从而实现复杂的逻辑分支。

二、条件分组统计实战案例

1. 销售额按区域分类统计

需求:统计每个区域销售额,并按以下条件分类汇总:

  • 销售额大于 5000 为“高销量”。
  • 销售额在 2000-5000 之间为“中销量”。
  • 销售额小于 2000 为“低销量”。

表结构 sales

sales_idregionemployeeamount
1EastAlice6000
2EastBob4500
3WestCarol1500
4WestDavid7000
5EastEve1200

SQL 实现
sql">SELECT  region,  COUNT(CASE WHEN amount > 5000 THEN 1 END) AS 高销量,  COUNT(CASE WHEN amount BETWEEN 2000 AND 5000 THEN 1 END) AS 中销量,  COUNT(CASE WHEN amount < 2000 THEN 1 END) AS 低销量  
FROM sales  
GROUP BY region;  

查询结果

region高销量中销量低销量
East111
West101

解释

  • 条件分组统计CASE WHEN 通过判断条件返回 1NULL,再通过 COUNT 统计非空记录,实现条件统计分组。
  • 高效执行:相比多次查询,CASE WHEN 可以在一次扫描中完成多个条件分组统计,提高执行效率。

三、实现多重分类统计

2. 按销售额区间统计销售记录数

需求:统计所有销售记录,并按销售额区间进行分类统计:

  • 0-1000 为“极低”。
  • 1001-3000 为“低”。
  • 3001-6000 为“中”。
  • 6001 以上为“高”。

SQL 实现
sql">SELECT  COUNT(*) AS 总记录数,  COUNT(CASE WHEN amount BETWEEN 0 AND 1000 THEN 1 END) AS 极低,  COUNT(CASE WHEN amount BETWEEN 1001 AND 3000 THEN 1 END) AS,  COUNT(CASE WHEN amount BETWEEN 3001 AND 6000 THEN 1 END) AS,  COUNT(CASE WHEN amount > 6000 THEN 1 END) ASFROM sales;  

查询结果

总记录数极低
51121

解释

  • COUNT(*) 统计所有记录数。
  • CASE WHEN 将不同的销售额区间分类统计并汇总在同一结果集中。

四、统计百分比与占比

3. 统计各区域销售额占比

需求:统计每个区域的销售额总和及其占总销售额的百分比。


SQL 实现
sql">SELECT  region,  SUM(amount) AS 区域销售额,  ROUND(SUM(amount) * 100 / SUM(SUM(amount)) OVER (), 2) AS 占比  
FROM sales  
GROUP BY region;  

查询结果

region区域销售额占比
East1170058.50
West850041.50

解释

  • SUM(SUM(amount)) OVER () 计算全表销售总额。
  • 每个区域的销售额除以总销售额计算出占比。
  • 使用 ROUND 保留两位小数。

五、按条件汇总多列统计

4. 多列条件分组统计

需求:统计每个区域销售额大于 5000 的记录数,并计算销售总额和平均值。


SQL 实现
sql">SELECT  region,  COUNT(*) AS 记录总数,  COUNT(CASE WHEN amount > 5000 THEN 1 END) AS 高销量,  SUM(amount) AS 总销售额,  AVG(amount) AS 平均销售额  
FROM sales  
GROUP BY region;  

查询结果

region记录总数高销量总销售额平均销售额
East31117003900
West2185004250

六、应用场景与优化建议

1. 应用场景
  • 动态报表生成:在生成销售报表、业绩分析时,可以动态按条件分类汇总。
  • 数据清洗与分组:在数据清洗和预处理过程中,快速按条件对数据进行分组统计。
  • 复杂条件筛选:在多条件组合筛选时,可以避免大量子查询,提升查询效率。

2. 优化建议
  1. 利用索引:为参与 CASE WHEN 条件判断的字段建立索引,减少全表扫描。
  2. 避免嵌套:尽量避免嵌套子查询,将逻辑在一次查询中完成。
  3. 分组粒度控制:合理选择分区字段,避免分区粒度过大,导致结果集过多或过少。

七、总结

  • CASE WHEN 是 SQL 查询中不可或缺的利器,能够灵活地实现多条件分组、分类统计和数据清洗。
  • 通过嵌套在 COUNT()SUM() 等聚合函数中,CASE WHEN 可以实现条件汇总与分组,极大地提高 SQL 查询的灵活性和效率。
  • 在实际开发中,合理使用 CASE WHEN 可以减少冗余查询,提升代码可读性和维护性,帮助快速完成复杂的业务需求。

http://www.ppmy.cn/server/153009.html

相关文章

Unity命令行传递自定义参数 命令行打包

命令行参数增加位置 -executeMethod 某脚本.某方法 参数1 参数2 参数3 ... 例如执行EditorTest.GetCommandLineArgs方法 增加两个命令行参数 Version=125 CDNVersion=100 -executeMethod EditorTest.GetCommandLineArgs Version=125 CDNVersion=100 Unity测试脚本 需要放在…

前端react入门day01-了解react和JSX基础

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 React介绍? React是什么 React的优势? React的市场情况? 开发环境搭建? 使用create-react-app快速…

微信小程序:轻应用的未来与无限可能

文章目录 前言一、微信小程序的诞生与发展二、微信小程序的核心特点三、微信小程序的优势四、微信小程序的应用场景五、微信小程序面临的挑战六、微信小程序的未来展望结语 前言 在移动互联网快速发展的今天&#xff0c;用户对于便捷性和即时性的需求日益增长。为了满足这一需…

软考教材重点内容 信息安全工程师 第 10 章 入侵检测技术原理与应用

10.1.2 入侵检测模型 入侵检测框架模型简称为 CIDF。该模型认为入侵检测系统由事件产生器 generators )、事件分析器(event analyzers)、响应单元(response units)和事件数据库 even databases)组成。 10.1.3 入侵检测作用 入侵检测系统在网络安全保障过程中扮演类似“预警机”…

[Unity Shader][图形渲染] Shader数学基础11 - 复合变换详解

在图形学与Shader编程中,复合变换是将平移、旋转和缩放等基本几何变换组合在一起,从而实现更复杂的物体变换效果。复合变换的本质是通过矩阵的串联操作,依次应用多个变换。 本文将介绍复合变换的数学原理、矩阵计算方法及注意事项,并结合实际编程中的实现细节帮助你掌握其…

美国加州房价数据分析02

5. 特征工程 5.1重构数据集 承接上文提到的相似度排名&#xff0c;去掉部分无关的特征。 train_set.corr()["median_house_value"].sort_values(ascendingFalse)为了提高模型训练后的鲁棒性&#xff0c;即防止过拟合&#xff0c;不建议删除关联度最低几项特征&#…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

MapReduce工作流程+Shuffle机制

一、Mapreduce工作流程 &#xff08;1&#xff09;数据切片Split。数据切片数决定maptask并行度&#xff0c;默认情况下&#xff0c;一个切片大小块大小。切片不是针对整体数据集&#xff0c;而是针对每一个文件单独切片&#xff0c;所以会有小文件问题&#xff08;CombineTex…