CASE WHEN THEN

本文介绍 SQL 中 Case When 语句的应用技巧,特别是在统计不同条件下的记录数量时的使用方法。通过具体案例展示了如何结合 Case When 和 Sum 函数进行复杂的数据汇总。

 

SQL语句中SUM统计函数在统计次数的时候就不能用了,此时需要借助CASE WHEN THEN语句,这里做个笔记,以策查询。

Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
如今天遇到的对各个报警级别的次数的统计,因为各个级别均为数字,不能直接用sum函数,这时case就能派上用处了。

 select sum(case trs_rest when '0' then 1 end) ALM0 from alm_inf

select sum(case trs_rest when '0' then 1 end) ALM1 from alm_inf.。。。

今天写了个惊天地,泣鬼神的SQL语句,好长啊。。。用的就是case when

SELECT noo,LVL0,LVL1,LVL2,LVL3,LVL4,LVLSUM,ALM40,ALM41,ALM42,ALM43,ALM44,ALMSUM4,
ALM30,ALM31,ALM32,ALM33,ALM34,ALMSUM3,ALM20,ALM21,ALM22,ALM23,ALM24,ALMSUM2 FROM
( SELECT noo, sum(case alm_lvl when 0 then 1 end) LVL0, sum(case alm_lvl when 1 then 1 end)
 LVL1, sum(case alm_lvl when 2 then 1 end) LVL2, sum(case alm_lvl when 3 then 1 end) LVL3,
 sum(case alm_lvl when 4 then 1 end) LVL4, sum(1) LVLSUM from
 ( select sys_brch_no as noo,alm_lvl,SYS_BRCH_NO 
 from alm_inf a,alm_rule b where a.rule_id=b.rule_id 
 ) group by noo)LVL,(
  select soo,
   sum(case when trs_rest=0 and alm_lvl=4 then 1 end) ALM40,
   sum(case when trs_rest=1 and alm_lvl=4  then 1 end) ALM41,
   sum(case when trs_rest=2 and alm_lvl=4 then 1 end) ALM42,
   sum(case when trs_rest=3 and alm_lvl=4 then 1 end) ALM43,
   sum(case when trs_rest=4 and alm_lvl=4 then 1 end) ALM44,
   sum(case when alm_lvl=4 then 1 end ) ALMSUM4,
   sum(case when trs_rest=0 and alm_lvl=3 then 1 end) ALM30,
   sum(case when trs_rest=1 and alm_lvl=3  then 1 end) ALM31,
   sum(case when trs_rest=2 and alm_lvl=3 then 1 end) ALM32,
   sum(case when trs_rest=3 and alm_lvl=3 then 1 end) ALM33,
   sum(case when trs_rest=4 and alm_lvl=3 then 1 end) ALM34,
   sum(case when alm_lvl=3 then 1 end ) ALMSUM3,
   sum(case when trs_rest=0 and alm_lvl<3 then 1 end) ALM20,
   sum(case when trs_rest=1 and alm_lvl<3  then 1 end) ALM21,
   sum(case when trs_rest=2 and alm_lvl<3 then 1 end) ALM22,
   sum(case when trs_rest=3 and alm_lvl<3 then 1 end) ALM23,
   sum(case when trs_rest=4 and alm_lvl<3 then 1 end) ALM24,
   sum(case when alm_lvl<3 then 1 end ) ALMSUM2
    from ( select sys_brch_no as soo,trs_flag,trs_rest,alm_lvl from alm_inf a,alm_rule b where a.rule_id=b.rule_id   )
    where trs_flag='1' group by soo ) ALM WHERE LVL.noo=ALM.soo

### SQL `CASE WHEN THEN` 用法和示例 SQL 中的 `CASE WHEN THEN` 是一种条件表达式,用于在查询中实现逻辑判断。它类似于编程语言中的 `if-then-else` 结构,允许根据不同的条件返回不同的值。 #### 基本语法 ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` - **condition**: 条件表达式,如果为真,则返回对应的 `result`。 - **result**: 当条件为真时返回的结果。 - **default_result**(可选): 如果所有条件都不满足,则返回该结果;如果没有指定 `ELSE`,则默认返回 `NULL`。 #### 示例 ##### 示例 1:基础分类 假设有一个表 `school.score` 包含字段 `s_id`, `c_id`, 和 `s_score`,需要根据分数是否及格进行分类: ```sql SELECT s.s_id, s.c_id, (CASE WHEN s.s_score < 60 THEN '不及格' ELSE '及格' END) AS 分数 FROM school.score s; ``` 此查询会根据学生的分数返回“不及格”或“及格”的标签[^3]。 ##### 示例 2:多条件分类 考虑一个包含用户信息的表 `users`,其中字段包括 `id`, `name`, 和 `sex`。`sex` 字段使用数字表示性别(如 1 表示男性,2 表示女性)。可以通过以下 SQL 查询将数字转换为更具可读性的文本描述: ```sql SELECT id, name, (CASE WHEN sex = 1 THEN '男' WHEN sex = 2 THEN '女' ELSE '未知' END) AS 性别 FROM users; ``` 这个查询会检查 `sex` 字段的值,并返回相应的性别描述[^2]。 ##### 示例 3:优先级问题 需要注意的是,`CASE` 函数只会返回第一个符合条件的值,后续的条件将被忽略。例如,以下 SQL 永远不会返回“第二类”: ```sql SELECT (CASE WHEN col_1 IN ('a', 'b') THEN '第一类' WHEN col_1 IN ('a') THEN '第二类' ELSE '其他' END) AS 类型 FROM some_table; ``` 在此查询中,如果 `col_1` 的值是 `'a'`,则会匹配第一个 `WHEN` 子句并返回“第一类”,而不会继续检查第二个 `WHEN` 子句[^1]。 #### 使用场景 1. **数据清洗**:将原始数据转换为更易理解的形式,例如将数字编码转换为文本描述。 2. **业务逻辑实现**:在查询中实现复杂的业务规则,例如根据销售额计算奖金比例。 3. **动态列生成**:根据某些条件生成新的列,例如根据年龄范围划分年龄段。 #### 注意事项 - **顺序重要性**:确保最重要的条件排在前面,因为一旦找到匹配项,后续的条件将不再评估。 - **性能优化**:避免在 `CASE` 表达式中使用过于复杂的条件,以免影响查询性能。 - **可读性**:合理使用缩进和换行以提高代码的可读性。 通过这些示例和用法,可以更好地理解和应用 SQL 中的 `CASE WHEN THEN` 语句来处理各种条件判断需求。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值