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

这篇具有很好参考价值的文章主要介绍了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);
  • 示例展示
productID productName categoryID unitPrice stockQuantity
1 Laptop 1 800 50
2 Smartphone 1 500 100
3 T-shirt 2 20 200
4 Jeans 2 40 150
5 Headphones 1 100 75

一. CASE WHEN 基础使用

1. CASE WHEN-基本使用

SELECT
	ProductName,
	UnitPrice,
CASE
		
		WHEN UnitPrice > 100 THEN
		'Expensive' ELSE 'Affordable' 
	END AS PriceCategory 
FROM
	Products;

查询结果:

ProductName UnitPrice PriceCategory
Laptop 800 Expensive
Smartphone 500 Expensive
T-shirt 20 Affordable
Jeans 40 Affordable
Headphones 100 Affordable

2. CASE WHEN-多条件

SELECT
	productName,
	stockQuantity,
CASE
		
		WHEN stockQuantity > 100 THEN
		'In Stock' 
		WHEN stockQuantity > 50 THEN
		'Limited Stock' ELSE 'Out of Stock' 
	END AS StockStatus 
FROM
	products;

查询结果:

productName stockQuantity StockStatus
Laptop 50 Out of Stock
Smartphone 100 Limited Stock
T-shirt 200 In Stock
Jeans 150 In Stock
Headphones 75 Limited Stock

3. CASE WHEN-聚合函数

SELECT
	categoryID,
	AVG( unitPrice ) AS AvgPrice,
CASE
		
		WHEN AVG( unitPrice ) > 50 THEN
		'High Price' ELSE 'Low Price' 
	END AS PriceCategory 
FROM
	products 
GROUP BY
	categoryID;
  • 查询结果
categoryID AvgPrice PriceCategory
1 466.6667 Hign Price
2 30 low Price

4. CASE WHEN-日期条件

SELECT
	productName,
CASE
		
		WHEN EXTRACT( MONTH FROM CURRENT_DATE ) = 8 THEN
		( SELECT NOW() ) ELSE 'Other Month' 
	END AS CurrentTime 
FROM
	products;
  • 查询结果
productName CurrentTime
Laptop 2023/8/30 19:14
Smartphone 2023/8/30 19:14
T-shirt 2023/8/30 19:14
Jeans 2023/8/30 19:14
Headphones 2023/8/30 19:14

5. CASE WHEN-用于排序

SELECT
    ProductName,
    UnitPrice,
    CASE
        WHEN UnitPrice > 50 THEN 'Expensive'
        ELSE 'Affordable'
    END AS PriceCategory
FROM Products
ORDER BY UnitPrice DESC;
  • 查询结果
productName unitPrice PriceCategory
Laptop 1902/3/10 0:00 Expensive
Smartphone 1901/5/14 0:00 Expensive
Headphones 1900/4/9 0:00 Expensive
Jeans 1900/2/9 0:00 Affordable
T-shirt 1900/1/20 0:00 Affordable

6. CASE WHEN-子查询

SELECT
	productName,
	unitPrice,
	( CASE WHEN unitPrice > ( SELECT AVG( unitPrice ) FROM products ) THEN 'Above Avg' ELSE 'Below Avg' END ) AS PriceComparison 
FROM
	products;
  • 查询结果
productName unitPrice PriceComparison
Laptop 800 Above Avg
Smartphone 500 Above Avg
T-shirt 20 Below Avg
Jeans 40 Below Avg
Headphones 100 Below Avg

7. CASE WHEN-计算字段

SELECT
    ProductName,
    UnitPrice,
    StockQuantity,
    CASE
        WHEN StockQuantity > 0 THEN UnitPrice / StockQuantity
        ELSE 0
    END AS PricePerUnit
FROM Products;
  • 查询结果
productName unitPrice stockQuantity PricePerUnit
Laptop 800 50 16
Smartphone 500 100 5
T-shirt 20 200 0.1
Jeans 40 150 0.2667
Headphones 100 75 1.3333

8. CASE WHEN-动态列名

SELECT
	productName,
	unitPrice,
	stockQuantity,
CASE
		
		WHEN stockQuantity > 150 THEN
		'High' 
		WHEN stockQuantity > 100 THEN
		'Medium' ELSE 'Low' 
	END AS StockCategory,
CASE
		
		WHEN stockQuantity > 100 THEN
		stockQuantity * 1.1 ELSE stockQuantity * 1.05 
	END AS AdjustedStock 
FROM
	products;
  • 查询结果
productName unitPrice stockQuantity StockCategory AdjustedStock
Laptop 800 50 Low 52.5
Smartphone 500 100 Low 105
T-shirt 20 200 High 220
Jeans 40 150 Medium 165
Headphones 100 75 Low 78.75

9. CASE WHEN-带有嵌套逻辑

SELECT
    ProductName,
    UnitPrice,
    CASE
        WHEN StockQuantity > 100 THEN
            CASE
                WHEN UnitPrice > 50 THEN 'High Demand, High Price'
                ELSE 'High Demand, Affordable'
            END
        ELSE 'Low Demand'
    END AS ProductStatus
FROM Products;
  • 查询结果
productName unitPrice ProductStatus
Laptop 800 Low Demand
Smartphone 500 Low Demand
T-shirt 20 High Demand, Affordable
Jeans 40 High Demand, Affordable
Headphones 100 Low Demand

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

SELECT
    ProductName,
    CASE
        WHEN ProductName LIKE '%Laptop%' THEN 'Electronics'
        WHEN ProductName LIKE '%T-shirt%' THEN 'Clothing'
        ELSE 'Other'
    END AS Category
FROM Products;
  • 查询结果
productName Category
Laptop Electronics
Smartphone Other
T-shirt Clothing
Jeans Other
Headphones Other

11. CASE WHEN-用于条件合并

SELECT
    ProductName,
    UnitPrice,
    CASE
        WHEN 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;
  • 查询结果
productName unitPrice ProductStatus
Laptop 800 High Price or High Stock
Smartphone 500 High Price, High Stock
T-shirt 20 High Price or High Stock
Jeans 40 High Price or High Stock
Headphones 100 High Price, High Stock

12. CASE WHEN-处理多列

SELECT
    ProductName,
    UnitPrice,
    StockQuantity,
    CASE
        WHEN 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;
  • 查询结果
productName unitPrice stockQuantity ProductCategory
Laptop 800 50 Limited Stock, Expensive
Smartphone 500 100 Popular and Expensive
T-shirt 20 200 Popular and Affordable
Jeans 40 150 Popular and Expensive
Headphones 100 75 Popular and Expensive

13. CASE WHEN-加入窗口函数

SELECT
    ProductName,
    UnitPrice,
    StockQuantity,
    CASE
        WHEN StockQuantity > AVG(StockQuantity) OVER () THEN 'Above Avg Stock'
        ELSE 'Below Avg Stock'
    END AS StockComparison
FROM Products;
  • 查询结果
productName unitPrice stockQuantity StockComparison
T-shirt 20 200 Above Avg Stock
Laptop 800 50 Below Avg Stock
Jeans 40 150 Above Avg Stock
Smartphone 500 100 Below Avg Stock
Headphones 100 75 Below Avg Stock

二. CASE WHEN 进阶使用

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

样例SQL:

SELECT
    p.ProductID,
    p.ProductName,
    s.SaleDate,
    s.QuantitySold,
    CASE
        WHEN 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:

SELECT
    o.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:

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

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

样例SQL:

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

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

样例SQL:

SELECT
    OrderID,
    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来对现有数据进行重新编码,例如将文本值转换为数字编码或将某些字符串转换为更易于处理的标识符。

SELECT
    customerName,
    CASE
        WHEN customerType = 'Individual' THEN 1
        WHEN customerType = 'Corporate' THEN 2
        ELSE 0
    END AS CustomerTypeCode
FROM Customers;

2. 条件分组

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

SELECT
    productName,
    SUM(quantity) AS totalQuantity,
    CASE
        WHEN 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,您可以根据不同条件动态调整查询结果的排序规则。

SELECT
    productName,
    unitPrice
FROM Products
ORDER BY
    CASE
        WHEN category = 'Electronics' THEN unitPrice
        WHEN category = 'Clothing' THEN unitPrice * 0.9
        ELSE unitPrice * 1.1
    END;

4. 分位数分析

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

SELECT
    productName,
    unitPrice,
    CASE
        WHEN 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可以根据条件将缺失的数据点填充为特定值,从而更好地处理数据缺失情况。

SELECT
    orderID,
    orderDate,
    CASE
        WHEN orderAmount IS NULL THEN 0
        ELSE orderAmount
    END AS FilledOrderAmount
FROM Orders;

6. 日期区间分析

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

SELECT
    orderDate,
    CASE
        WHEN 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可以根据特定业务规则判断数据所处的不同阶段,如用户生命周期阶段、订单处理阶段等。

SELECT
    userID,
    registrationDate,
    CASE
        WHEN 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可以在查询结果中根据条件选择不同的列,从而根据业务需求定制查询结果。

SELECT
    orderID,
    orderDate,
    CASE
        WHEN displayPrice = 'Gross' THEN grossPrice
        ELSE netPrice
    END AS SelectedPrice
FROM Orders;

9. 异常值标记

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

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

10. 数据格式转换

使用CASE WHEN可以在不同的数据格式之间进行转换,例如将布尔值转换为文本标签。文章来源地址https://www.toymoban.com/news/detail-696243.html

SELECT
    productID,
    productName,
    inStock,
    CASE
        WHEN inStock THEN 'Available'
        ELSE 'Out of Stock'
    END AS StockStatus
FROM Products;

到了这里,关于SQL中的CASE WHEN语句:从基础到高级应用指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • case when then else end语句的用法

    case具有两种格式。简单case函数和case搜索函数。 --简单case函数             case sex             when \\\'1\\\' then \\\'男\\\'             when \\\'2\\\' then \\\'女\\\'             else \\\'其他\\\' end  --case搜索函数--经常用的是这个             case when sex = \\\'1\\\' then \\\'男\\\'  

    2024年02月10日
    浏览(69)
  • 数据库应用:MySQL数据库SQL高级语句与操作

    目录 一、理论 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.MySQL中6种常见的约束 二、实验  1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.主键表和外键表  三、总结 克隆表:将数据表的数据记录生成到新的表中。 (1)克隆表 ① 先创建再导入 ② 创建

    2024年02月13日
    浏览(81)
  • MySQL 判断语句 条件函数 case when、if、ifnull

    在MySQL中,需要用到条件判断函数,例如 case when、if、ifnull。 (1)if 注意: 一个条件表达式两个结果 expr :条件表达式; 如果结果为true,则返回result_true,否则返回result_false。 (2)ifnull 注意: 如果查询结果是 null ,就转换为特定的值 result :查询结果; value :如果查询结

    2024年02月04日
    浏览(75)
  • Mybatis 常用条件语句,大于小于、if、for、模糊搜索、case when、choose

    目录 大于小于 if 条件判断  for循环 LIKE 模糊搜索 case when choose选择语句 前言-与正文无关         生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世

    2024年02月01日
    浏览(74)
  • sql示例:case when作为where 条件

    CASE WHEN语句的结果可以作为WHERE条件和其他条件一起使用,可以根据具体的需求来灵活组合。下面分别给出多个CASE WHEN语句在不同位置的SQL示例: CASE WHEN语句在WHERE条件中作为条件之一 上述代码中,CASE WHEN语句在WHERE条件中作为一个条件,其中condition_1和condition_2表示需要满足

    2024年02月16日
    浏览(76)
  • SQL中case when用法详解及使用案例

    Case具有两种格式。简单Case函数和Case搜索函数。 简单Case函数格式: Case搜索函数: case when与子查询性能比较及优化。 为了方便说明,我们先创建表,并造点数据。 统计亚洲和北美洲的人口数量,要求结果如下: 若第一时间没有想到case when,我们可能会写出下面的sql: 运行

    2024年02月15日
    浏览(82)
  • SQL SERVER case when的使用方法

    一、case when的使用方法 Case具有两种格式。简单Case函数和Case搜索函数。 第一种 格式 : 简单Case函数 : 格式说明 case 列名 when 条件值1 then 选项1 when 条件值2 then 选项2… else 默认值 end eg: select case job_level when ‘1’ then ‘1111’ when ‘2’ then ‘1111’ when ‘3’ then ‘1111’ else ‘e

    2024年02月13日
    浏览(73)
  • hive SQL: case when + group by 的用法

    假设有一个数据表,包含了不同人员的信息,其中包括姓名、性别、年龄等字段。现在需要统计不同年龄区间的人数,并按照年龄区间进行分组。可以使用如下 SQL 语句实现: ``` SELECT    CASE      WHEN age BETWEEN 0 AND 10 THEN \\\'0-10\\\'      WHEN age BETWEEN 11 AND 20 THEN \\\'11-20\\\'      WHEN a

    2024年02月08日
    浏览(79)
  • 【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月18日
    浏览(130)
  • MySQL中的SQL高级语句[一](上篇)

    使用语言  MySQL 使用工具  Navicat Premium 16 代码能力快速提升小方法,看完代码自己敲一遍,十分有用 拖动表名到查询文件中就可以直接把名字拉进来 以下是使用脚本方法,也可以直接进行修改 中括号,就代表可写可不写  目录 1.修改数据表结构 1.1 修改数据库的表名  1.

    2024年04月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包