SQL中的CASE WHEN语句:从基础到高级应用指南

SQL中的CASE WHEN语句:从基础到高级应用指南

准备工作 - 表1: products 示例数据:

我们使用一个名为"Products"的表,包含以下列:ProductID、ProductName、CategoryID、UnitPrice、StockQuantity。

-- 建表
CREATE TABLE `products` (`productID` int(11) NOT NULL,`productName` varchar(255) DEFAULT NULL,`categoryID` int(11) DEFAULT NULL,`unitPrice` int(11) DEFAULT NULL,`stockQuantity` int(11) DEFAULT NULL,PRIMARY KEY (`productID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 样例数据
INSERT INTO `products` VALUES (1, 'Laptop', 1, 800, 50);
INSERT INTO `products` VALUES (2, 'Smartphone', 1, 500, 100);
INSERT INTO `products` VALUES (3, 'T-shirt', 2, 20, 200);
INSERT INTO `products` VALUES (4, 'Jeans', 2, 40, 150);
INSERT INTO `products` VALUES (5, 'Headphones', 1, 100, 75);
  • 示例展示
productIDproductNamecategoryIDunitPricestockQuantity
1Laptop180050
2Smartphone1500100
3T-shirt220200
4Jeans240150
5Headphones110075

一. CASE WHEN 基础使用

1. CASE WHEN-基本使用

SELECTProductName,UnitPrice,
CASEWHEN UnitPrice > 100 THEN'Expensive' ELSE 'Affordable' END AS PriceCategory 
FROMProducts;

查询结果:

ProductNameUnitPricePriceCategory
Laptop800Expensive
Smartphone500Expensive
T-shirt20Affordable
Jeans40Affordable
Headphones100Affordable

2. CASE WHEN-多条件

SELECTproductName,stockQuantity,
CASEWHEN stockQuantity > 100 THEN'In Stock' WHEN stockQuantity > 50 THEN'Limited Stock' ELSE 'Out of Stock' END AS StockStatus 
FROMproducts;

查询结果:

productNamestockQuantityStockStatus
Laptop50Out of Stock
Smartphone100Limited Stock
T-shirt200In Stock
Jeans150In Stock
Headphones75Limited Stock

3. CASE WHEN-聚合函数

SELECTcategoryID,AVG( unitPrice ) AS AvgPrice,
CASEWHEN AVG( unitPrice ) > 50 THEN'High Price' ELSE 'Low Price' END AS PriceCategory 
FROMproducts 
GROUP BYcategoryID;
  • 查询结果
categoryIDAvgPricePriceCategory
1466.6667Hign Price
230low Price

4. CASE WHEN-日期条件

SELECTproductName,
CASEWHEN EXTRACT( MONTH FROM CURRENT_DATE ) = 8 THEN( SELECT NOW() ) ELSE 'Other Month' END AS CurrentTime 
FROMproducts;
  • 查询结果
productNameCurrentTime
Laptop2023/8/30 19:14
Smartphone2023/8/30 19:14
T-shirt2023/8/30 19:14
Jeans2023/8/30 19:14
Headphones2023/8/30 19:14

5. CASE WHEN-用于排序

SELECTProductName,UnitPrice,CASEWHEN UnitPrice > 50 THEN 'Expensive'ELSE 'Affordable'END AS PriceCategory
FROM Products
ORDER BY UnitPrice DESC;
  • 查询结果
productNameunitPricePriceCategory
Laptop1902/3/10 0:00Expensive
Smartphone1901/5/14 0:00Expensive
Headphones1900/4/9 0:00Expensive
Jeans1900/2/9 0:00Affordable
T-shirt1900/1/20 0:00Affordable

6. CASE WHEN-子查询

SELECTproductName,unitPrice,( CASE WHEN unitPrice > ( SELECT AVG( unitPrice ) FROM products ) THEN 'Above Avg' ELSE 'Below Avg' END ) AS PriceComparison 
FROMproducts;
  • 查询结果
productNameunitPricePriceComparison
Laptop800Above Avg
Smartphone500Above Avg
T-shirt20Below Avg
Jeans40Below Avg
Headphones100Below Avg

7. CASE WHEN-计算字段

SELECTProductName,UnitPrice,StockQuantity,CASEWHEN StockQuantity > 0 THEN UnitPrice / StockQuantityELSE 0END AS PricePerUnit
FROM Products;
  • 查询结果
productNameunitPricestockQuantityPricePerUnit
Laptop8005016
Smartphone5001005
T-shirt202000.1
Jeans401500.2667
Headphones100751.3333

8. CASE WHEN-动态列名

SELECTproductName,unitPrice,stockQuantity,
CASEWHEN stockQuantity > 150 THEN'High' WHEN stockQuantity > 100 THEN'Medium' ELSE 'Low' END AS StockCategory,
CASEWHEN stockQuantity > 100 THENstockQuantity * 1.1 ELSE stockQuantity * 1.05 END AS AdjustedStock 
FROMproducts;
  • 查询结果
productNameunitPricestockQuantityStockCategoryAdjustedStock
Laptop80050Low52.5
Smartphone500100Low105
T-shirt20200High220
Jeans40150Medium165
Headphones10075Low78.75

9. CASE WHEN-带有嵌套逻辑

SELECTProductName,UnitPrice,CASEWHEN StockQuantity > 100 THENCASEWHEN UnitPrice > 50 THEN 'High Demand, High Price'ELSE 'High Demand, Affordable'ENDELSE 'Low Demand'END AS ProductStatus
FROM Products;
  • 查询结果
productNameunitPriceProductStatus
Laptop800Low Demand
Smartphone500Low Demand
T-shirt20High Demand, Affordable
Jeans40High Demand, Affordable
Headphones100Low Demand

10. CASE WHEN-处理字符串匹配

SELECTProductName,CASEWHEN ProductName LIKE '%Laptop%' THEN 'Electronics'WHEN ProductName LIKE '%T-shirt%' THEN 'Clothing'ELSE 'Other'END AS Category
FROM Products;
  • 查询结果
productNameCategory
LaptopElectronics
SmartphoneOther
T-shirtClothing
JeansOther
HeadphonesOther

11. CASE WHEN-用于条件合并

SELECTProductName,UnitPrice,CASEWHEN UnitPrice > 50 AND StockQuantity > 50 THEN 'High Price, High Stock'WHEN UnitPrice > 50 OR StockQuantity > 50 THEN 'High Price or High Stock'ELSE 'Low Price and Low Stock'END AS ProductStatus
FROM Products;
  • 查询结果
productNameunitPriceProductStatus
Laptop800High Price or High Stock
Smartphone500High Price, High Stock
T-shirt20High Price or High Stock
Jeans40High Price or High Stock
Headphones100High Price, High Stock

12. CASE WHEN-处理多列

SELECTProductName,UnitPrice,StockQuantity,CASEWHEN StockQuantity > 50 AND UnitPrice <30 THEN 'Popular and Affordable'WHEN StockQuantity <= 50 AND UnitPrice < 30 THEN 'Limited Stock, Affordable'WHEN StockQuantity > 50 AND UnitPrice >= 30 THEN 'Popular and Expensive'ELSE 'Limited Stock, Expensive'END AS ProductCategory
FROM Products;
  • 查询结果
productNameunitPricestockQuantityProductCategory
Laptop80050Limited Stock, Expensive
Smartphone500100Popular and Expensive
T-shirt20200Popular and Affordable
Jeans40150Popular and Expensive
Headphones10075Popular and Expensive

13. CASE WHEN-加入窗口函数

SELECTProductName,UnitPrice,StockQuantity,CASEWHEN StockQuantity > AVG(StockQuantity) OVER () THEN 'Above Avg Stock'ELSE 'Below Avg Stock'END AS StockComparison
FROM Products;
  • 查询结果
productNameunitPricestockQuantityStockComparison
T-shirt20200Above Avg Stock
Laptop80050Below Avg Stock
Jeans40150Above Avg Stock
Smartphone500100Below Avg Stock
Headphones10075Below Avg Stock

二. CASE WHEN 进阶使用

1. 基于历史数据的趋势预测

样例SQL:

SELECTp.ProductID,p.ProductName,s.SaleDate,s.QuantitySold,CASEWHEN s.QuantitySold > LAG(s.QuantitySold) OVER (PARTITION BY p.ProductID ORDER BY s.SaleDate) THEN 'Increased'WHEN s.QuantitySold < LAG(s.QuantitySold) OVER (PARTITION BY p.ProductID ORDER BY s.SaleDate) THEN 'Decreased'ELSE 'Stable'END AS Trend
FROM Products p
JOIN SalesHistory s ON p.ProductID = s.ProductID;

2. 基于不同维度的复杂分析

样例SQL:

SELECTo.OrderID,o.OrderDate,SUM(CASE WHEN p.CategoryID = 1 THEN o.Quantity ELSE 0 END) AS ElectronicsQuantity,SUM(CASE WHEN p.CategoryID = 2 THEN o.Quantity ELSE 0 END) AS ClothingQuantity,SUM(CASE WHEN p.CategoryID = 3 THEN o.Quantity ELSE 0 END) AS OtherQuantity
FROM Orders o
JOIN Products p ON o.ProductID = p.ProductID
GROUP BY o.OrderID, o.OrderDate;

3. 多层次CASE WHEN分析

样例SQL:

SELECTEmployeeID,FirstName,LastName,Salary,CASEWHEN Salary > 70000 THEN 'High'WHEN Salary > 60000 THEN 'Medium'WHEN Salary > 50000 THEN 'Low'ELSE 'Very Low'END AS SalaryLevel,CASEWHEN Salary > 60000 THEN 'Above Average'ELSE 'Below Average'END AS SalaryComparison
FROM Employees;

4. 使用CASE WHEN进行数据分桶

样例SQL:

SELECTCustomerID,Age,Gender,CASEWHEN Age < 30 THEN 'Young'WHEN Age >= 30 AND Age < 40 THEN 'Middle-aged'ELSE 'Senior'END AS AgeGroup,CASEWHEN Gender = 'Male' THEN 'Male'WHEN Gender = 'Female' THEN 'Female'ELSE 'Other'END AS GenderCategory
FROM Customers;

5. 基于多条件的复杂逻辑判断

样例SQL:

SELECTOrderID,OrderDate,SUM(CASE WHEN Quantity * Price > 500 THEN Quantity ELSE 0 END) AS HighValueItems,SUM(CASE WHEN Quantity * Price > 100 AND Quantity * Price <= 500 THEN Quantity ELSE 0 END) AS MediumValueItems,SUM(CASE WHEN Quantity * Price <= 100 THEN Quantity ELSE 0 END) AS LowValueItems
FROM Orders
GROUP BY OrderID, OrderDate;

三. CASE WHEN 业务场景常用技巧

1. 数据重编码

您可以使用CASE WHEN来对现有数据进行重新编码,例如将文本值转换为数字编码或将某些字符串转换为更易于处理的标识符。

SELECTcustomerName,CASEWHEN customerType = 'Individual' THEN 1WHEN customerType = 'Corporate' THEN 2ELSE 0END AS CustomerTypeCode
FROM Customers;

2. 条件分组

使用CASE WHEN可以在查询结果中创建不同的数据分组,而无需在实际数据中创建新的列。

SELECTproductName,SUM(quantity) AS totalQuantity,CASEWHEN SUM(quantity) > 100 THEN 'High'WHEN SUM(quantity) > 50 THEN 'Medium'ELSE 'Low'END AS QuantityGroup
FROM Sales
GROUP BY productName;

3. 动态排序规则

通过在ORDER BY子句中使用CASE WHEN,您可以根据不同条件动态调整查询结果的排序规则。

SELECTproductName,unitPrice
FROM Products
ORDER BYCASEWHEN category = 'Electronics' THEN unitPriceWHEN category = 'Clothing' THEN unitPrice * 0.9ELSE unitPrice * 1.1END;

4. 分位数分析

使用CASE WHEN可以在查询结果中对数据进行分位数分析,识别哪些数据点位于不同的分位数区间。

SELECTproductName,unitPrice,CASEWHEN unitPrice <= PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q1'WHEN unitPrice <= PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q2'WHEN unitPrice <= PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q3'ELSE 'Q4'END AS PriceQuartile
FROM Products;

5. 缺失数据填充

使用CASE WHEN可以根据条件将缺失的数据点填充为特定值,从而更好地处理数据缺失情况。

SELECTorderID,orderDate,CASEWHEN orderAmount IS NULL THEN 0ELSE orderAmountEND AS FilledOrderAmount
FROM Orders;

6. 日期区间分析

使用CASE WHEN可以对日期进行区间分析,例如判断每个日期属于哪个季节、哪个月份等。

SELECTorderDate,CASEWHEN EXTRACT(MONTH FROM orderDate) IN (12, 1, 2) THEN 'Winter'WHEN EXTRACT(MONTH FROM orderDate) IN (3, 4, 5) THEN 'Spring'WHEN EXTRACT(MONTH FROM orderDate) IN (6, 7, 8) THEN 'Summer'ELSE 'Fall'END AS Season
FROM Orders;

7. 业务阶段分析

使用CASE WHEN可以根据特定业务规则判断数据所处的不同阶段,如用户生命周期阶段、订单处理阶段等。

SELECTuserID,registrationDate,CASEWHEN NOW() - registrationDate < INTERVAL '30 days' THEN 'New User'WHEN NOW() - registrationDate < INTERVAL '90 days' THEN 'Regular User'ELSE 'Inactive User'END AS UserStage
FROM Users;

8. 动态列选择

使用CASE WHEN可以在查询结果中根据条件选择不同的列,从而根据业务需求定制查询结果。

SELECTorderID,orderDate,CASEWHEN displayPrice = 'Gross' THEN grossPriceELSE netPriceEND AS SelectedPrice
FROM Orders;

9. 异常值标记

使用CASE WHEN可以根据条件识别和标记异常数据点,帮助进行数据质量分析。

SELECTcustomerID,orderDate,orderAmount,CASEWHEN orderAmount < 0 THEN 'Negative'WHEN orderAmount > 10000 THEN 'High Amount'ELSE 'Normal'END AS DataQuality
FROM Orders;

10. 数据格式转换

使用CASE WHEN可以在不同的数据格式之间进行转换,例如将布尔值转换为文本标签。

SELECTproductID,productName,inStock,CASEWHEN inStock THEN 'Available'ELSE 'Out of Stock'END AS StockStatus
FROM Products;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】Masonry的基本使用

文章目录 前言一、使用Masonry的原因二、约束的常识三、Masonry的简单使用四、Masonry的用例总结 前言 暑假安装了cocoapods&#xff0c;简单使用其调用了SVGKit&#xff0c;但是没有学习Masonry&#xff0c;特此总结博客记录Masonry的学习 一、使用Masonry的原因 Masonry是一…

最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库

一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Mi…

自动化安装Nginx脚本:简化您的服务器配置

在如今的网络世界中&#xff0c;Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;扮演着至关重要的角色。然而&#xff0c;手动安装和配置Nginx可能会耗费大量时间和精力&#xff0c;特别是对于那些对Linux系统不太熟悉的人来说。幸运的是&#xff0c;我们为您带来…

详解 SpringMVC 的 @RequestMapping 注解

文章目录 1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性5、RequestMapping注解的params属性&#xff08;了解&#xff09;6、RequestMapping注解的headers属性&#xff08;了解&#xff09;7、Sp…

6. vue-element-admin 二次开发避坑指南

vue-element-admin 二次开发避坑指南 1.1 前言1.1.1 切换标签时未保存页面的操作内容1.1.2 markdown 样式乱码1.1.3 修改默认尺寸1.1.4 当后端服务器宕机情况下页面加载层一直转圈无法停止&#xff0c;只能关闭页面1.1.5 隐藏齿轮 1.1 前言 上一篇博文&#xff0c;我们分享了vu…

从零构建深度学习推理框架-11 Resnet

op和layer结构 在runtime_ir.cpp中&#xff0c;我们上一节只构建了input和output&#xff0c;对于中间layer的具体实现一直没有完成&#xff1a; for (const auto& kOperator : this->operators_) {if (kOperator->type "pnnx.Input") {this->input_o…

ssm+vue“魅力”繁峙宣传网站源码和论文

ssmvue“魅力”繁峙宣传网站源码和论文102 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身…

C语言:截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章&#xff1a; 《C语言&#xff1a;整型提升》 《C语言&#xff1a;算数转换》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求…

使用安全复制命令scp在Windows系统和Linux系统之间相互传输文件

现在已经有很多远程控制服务器的第三方软件平台&#xff0c;比如FinalShell&#xff0c;MobaXterm等&#xff0c;半可视化界面&#xff0c;使用起来非常方便和友好&#xff0c;两个系统之间传输文件直接拖就行&#xff0c;当然也可以使用命令方式在两个系统之间相互传递。 目录…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别&#xff0c;epoll为什么高效&#xff1f; 54 说说多路IO复用技术有哪些&#xff0c;区别是什么&#xff1f; 55 简述socket中select&#xff0c;epoll的使用场景和区别&#xff0c;epoll水平触发与边缘触发的区别&#xff1f;…

利用Cython发布python项目

最近有个python项目要发布&#xff0c;遇到了两个问题&#xff0c;一是项目在windows下运行有点慢&#xff0c;二是python都是脚本直接运行&#xff0c;没法保护代码安全。查了一下&#xff0c;有人说可以利用Cython&#xff0c;把python代码编译成为C来调用。即能提高运行性能…

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代&#xff0c;快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎&#xff0c;为我们提供了一种优秀的解决方案。除了传统的文本搜索&#xff0c;El…

linux上vim编辑器设置

linux上vim编辑器设置 减少tab缩进、显示行号等 在vimrc&#xff08;一般在/etc/vim/vimrc中&#xff09;末尾添加 set helplangcn "中文帮助文档(前提是下了中文包) syntax enable syntax on " 自动语法高亮 set number"显示行号 colorscheme desert" 设…

【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管动态显示(五)

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL22G开发平台&#xff08;盘古22K&#xff09; 一&#xff1a;盘古22K开发板&#xff08;紫光同创PGL22G开发…

Java-API简析_java.util.HashTable<K, V>类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132522445 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

http和https的区别?

什么是 HTTP&#xff1f; HTTP是一种互联网数据传输协议&#xff0c;用于在网络服务器和客户端之间进行数据传输。作为万维网的基础&#xff0c;HTTP协议允许网络浏览器向网络服务器发送请求&#xff0c;服务器则会返回响应。HTTP协议基于文本&#xff0c;因此传输的数据是人类…

41.岛屿数量(第四期模拟笔试)(BFS练习题)

题目&#xff1a; 给定一个 m 行 n 列的二维地图&#xff0c;初始化每个单元格都是海洋&#xff0c;二维地图外也全是海洋。 操作 addLand 会将单元格&#xff08;col, row&#xff09;变为陆地。 定义一系列相连的被海洋包围的陆地为岛屿&#xff0c; 横向相邻或者纵向相连的…

多线程下的signal信号处理

多线程中&#xff0c;信号在哪个线程中处理是不确定的&#xff0c;可能被任意一个线程处理 下边的代码可以验证该结论&#xff0c;多次Ctrlc&#xff0c;会被不同的线程捕获此信号&#xff0c;并处理&#xff0c;最终每个线程死锁&#xff0c;阻塞在等待锁的状态 #include &l…

微信小程序请求接口返回的二维码(图片),本地工具和真机测试都能显示,上线之后不显示问题

请求后端接口返回的图片&#xff1a; 页面展示&#xff1a; 代码实现&#xff1a; :show-menu-by-longpress"true" 是长按保存图片 base64Code 是转为base64的地址 <image class"code" :src"base64Code" alt"" :show-menu-by-long…

2023-09-02力扣每日一题

链接&#xff1a; 2511. 最多可以摧毁的敌人城堡数目 题意和解&#xff1a; 阅读理解题&#xff0c;要从1到-1或-1到1&#xff0c;中间只能有0&#xff0c;求最多能有多少0 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; int captureForts(vect…