sql之case when 用法

贴两个例子:

由左图得到右图,可用如下sql:

          

  1. select (case
  2.          when chnl_type_id = '100' then
  3.           '自办营业厅'
  4.          when chnl_type_id = '200' then
  5.           '合作厅'
  6.          when chnl_type_id = '300' then
  7.           '外呼'
  8.          when chnl_type_id = '1' then
  9.           '10086人工'
  10.          when chnl_type_id = '2' then
  11.           '10086自动'
  12.          when chnl_type_id = '6' then
  13.           '短信营业厅'
  14.          when chnl_type_id = '5' then
  15.           '网上营业厅'
  16.          when chnl_type_id = '3' then
  17.           'WAP营业厅'
  18.          when chnl_type_id = '4' then
  19.           '自助终端'
  20.          else
  21.           ''
  22.        end) as chnl_type_id,
  23.        sum(biz_accept_cnt) as cnt1
  24.   from masacb.tb_cb_rs_echnl_key_serv_m t
  25.  where chnl_type_id in ('1''2''3''4''5''6''100''200''300')
  26.    and t.statis_month between 200801 and 200810
  27.    and t.area_id like '%'
  28.    and t.brand_id like '%'
  29.    and t.cust_type_id like '%'
  30.    and t.cust_lvl_id like '%'
  31.    and t.chg_mode like '1'
  32.    and t.biz_accept_type_id like '%'
  33.    and t.serv_type_id like '%'
  34.  group by t.chnl_type_id

例子2:

 

 

 

 

 

  1. select CUST_LVL_ID,
  2.        --biz_accept_type_id,
  3.        sum(case
  4.              when chnl_type_id = '100' then
  5.               cnt1
  6.            end) as 自办营业厅,
  7.        sum(case
  8.              when chnl_type_id = '200' then
  9.               cnt1
  10.            end) as 合作厅,
  11.        sum(case
  12.              when chnl_type_id = '300' then
  13.               cnt1
  14.            end) as 外呼,
  15.        sum(case
  16.              when chnl_type_id = '1' then
  17.               cnt1
  18.            end) as 人工,
  19.        sum(case
  20.              when chnl_type_id = '2' then
  21.               cnt1
  22.            end) as 自动,
  23.        sum(case
  24.              when chnl_type_id = '3' then
  25.               cnt1
  26.            end) as WAP营业厅,
  27.        sum(case
  28.              when chnl_type_id = '4' then
  29.               cnt1
  30.            end) as 自助终端,
  31.        sum(case
  32.              when chnl_type_id = '5' then
  33.               cnt1
  34.            end) as 网上营业厅,
  35.        sum(case
  36.              when chnl_type_id = '6' then
  37.               cnt1
  38.            end) as WAP营业厅
  39.   from (select (case
  40.                  when CUST_LVL_ID = '1' then
  41.                   '0元'
  42.                  when CUST_LVL_ID = '2' then
  43.                   '0-50元'
  44.                  when CUST_LVL_ID = '3' then
  45.                   '50-100元'
  46.                  when CUST_LVL_ID = '4' then
  47.                   '100-150元'
  48.                  when CUST_LVL_ID = '5' then
  49.                   '150-200元'
  50.                  when CUST_LVL_ID = '6' then
  51.                   '200元以上'
  52.                  else
  53.                   ''
  54.                end) as CUST_LVL_ID,
  55.                chnl_type_id,
  56.                sum(biz_accept_succ_cnt) as cnt1
  57.           from masacb.tb_cb_rs_echnl_key_serv_m t
  58.          where chnl_type_id in
  59.                ('1''2''3''4''5''6''100''200''300')
  60.          group by t.CUST_LVL_ID, t.chnl_type_id
  61.          order by t.cust_lvl_id)
  62.  group by CUST_LVL_ID

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<think>首先,用户的问题是关于SQLCASE WHEN语句的用法和示例。我需要根据系统级指令来构建我的回答。 系统级指令: 1. 所有行内数学表达式必须使用 $...$ 格式。但在SQL上下文中,数学表达式可能不常见,所以我需要确保如果有任何数学内容,比如在示例中,使用正确的格式。 2. 独立公式必须使用 $$...$$ 格式并单独成段。同样,在SQL中,公式可能不相关。 3. LaTeX语法正确。我会确保任何需要LaTeX的地方正确使用。 4. 使用中文回答。整个回答必须用中文。 5. 生成相关问题。在回答结束时,我需要生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如 [^1]。我参考了提供的引用,这些是关于SQL CASE WHEN的,所以我应该基于这些构建回答。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用:引用了四个来源 [^1], [^2], [^3], [^4],这些是关于SQL CASE WHEN的详细说明。 用户的问题:"我想了解SQLCASE WHEN的使用方法 请问SQL CASE WHEN语句的用法和示例" 我的回答结构: 1. **介绍**:简要解释CASE WHEN是什么,基于引用。 2. **基本语法**:解释CASE WHEN的基本语法,使用简单语言。 3. **用法**:讨论不同用法,如简单CASE WHEN和搜索CASE WHEN。 4. **示例**:提供实际SQL示例,展示如何使用。 5. **注意事项或最佳实践**:基于引用,添加一些技巧。 6. **生成相关问题**:在结束时,添加相关问题部分。 确保使用中文。 从引用中提取关键点: - 引用[1]:基本语法和用法,简单CASE WHEN语句。 - 引用[2]:使用技巧,基本语法,应用场景。 - 引用[3]:MySQL中的CASE WHEN,基本语法,简单搜索。 - 引用[4]:用法讲解,case when 条件1 then 结果1 else 结果2 end。 所以,我可以综合这些来创建回答。 在回答中,当引用段落时,在末尾添加 [^n] 标识。例如,如果我提到一个点来自引用[1],就在那句话末尾加 [^1]。 现在,构建回答大纲: - **开头**:介绍CASE WHEN语句。 - **部分1:基本语法** - 简单CASE WHEN - 搜索CASE WHEN - **部分2:用法和示例** - 示例1:简单CASE WHEN - 示例2:搜索CASE WHEN - 示例3:嵌套CASE WHEN - **部分3:应用场景和注意事项** - **结尾**:总结。 - **相关问题**:生成3-5个相关问题。 生成相关问题: - 基于主题,如优化、常见错误、与其他语句比较等。 最终,确保回答清晰、逐步。</think>### SQL CASE WHEN语句的用法和示例 在SQL中,CASE WHEN语句是一种强大的条件表达式,用于根据不同的条件执行分支逻辑,类似于编程语言中的if-else语句。它常用于SELECT查询中,用于创建基于条件的新列或处理复杂的数据转换。CASE WHEN语句灵活且易于使用,支持简单和搜索两种模式,以及嵌套结构。以下我将逐步解释其基本语法、用法和实际示例,确保内容真实可靠,并基于站内引用进行说明。 #### 1. **基本语法** CASE WHEN语句有两种主要形式:简单CASE WHEN和搜索CASE WHEN。基本语法如下: - **简单CASE WHEN**:直接比较一个字段的值,类似于switch-case语句。语法为: ``` CASE 字段 WHEN 值1 THEN 结果1 WHEN 值2 THEN 结果2 ... ELSE 默认结果 END ``` 这种形式适用于字段值直接匹配的场景,例如根据性别字段返回描述性文本 [^1]。 - **搜索CASE WHEN**:允许使用更复杂的条件(如不等式或组合条件),类似于if-else链。语法为: ``` CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ... ELSE 默认结果 END ``` 这种形式更灵活,常用于处理多条件判断,例如基于年龄范围分类用户 [^2]。 在SQL查询中,CASE WHEN可以用于SELECT、WHERE、ORDER BY等子句中,实现动态数据转换。注意,CASE WHEN语句必须用END关键字结束,且每个WHEN子句是互斥的(只执行第一个匹配的条件)[^3]。 #### 2. **用法详解** CASE WHEN语句的核心用途是根据条件返回不同的值,常见应用包括: - **数据分类**:将数值字段转换为类别标签(如将分数转换为等级)。 - **空值处理**:用默认值替代NULL值。 - **复杂逻辑**:嵌套多个CASE WHEN语句,实现多层条件判断。 - **聚合函数结合**:在SUM、COUNT等函数中使用,实现条件聚合。 最佳实践: - 使用ELSE子句处理未匹配情况,避免返回NULL。 - 在嵌套使用时,确保逻辑清晰,避免性能问题(嵌套层数过多可能影响查询效率)。 - CASE WHEN是表达式,因此可以用于任何允许表达式的地方,例如创建计算列 [^4]。 #### 3. **实际示例** 以下示例基于MySQL语法(兼容大多数SQL数据库),展示CASE WHEN的常见用法。假设有一个`students`表,包含字段:`id`(学生ID)、`name`(姓名)、`score`(分数)、`gender`(性别)。 - **示例1:简单CASE WHEN(用于字段值匹配)** 将性别字段转换为中文描述: ```sql SELECT name, CASE gender WHEN 'M' THEN '男' WHEN 'F' THEN '女' ELSE '未知' END AS gender_cn FROM students; ``` 结果:如果`gender`为'M',则返回'男';为'F'则返回'女';否则返回'未知'。此示例展示了基本值匹配的简洁性 [^1]。 - **示例2:搜索CASE WHEN(用于复杂条件)** 根据分数范围分类学生等级: ```sql SELECT name, score, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 80 THEN '良好' WHEN score >= 60 THEN '及格' ELSE '不及格' END AS grade FROM students; ``` 结果:根据分数动态计算等级。注意,条件从上到下执行,第一个匹配的WHEN生效(例如,90分以上直接返回'优秀',不再检查后续条件)[^2]。 - **示例3:嵌套CASE WHEN(多层逻辑)** 结合性别和分数进行综合评估: ```sql SELECT name, CASE WHEN gender = 'M' THEN CASE WHEN score > 85 THEN '男生高分' ELSE '男生一般' END WHEN gender = 'F' THEN CASE WHEN score > 85 THEN '女生高分' ELSE '女生一般' END ELSE '其他' END AS evaluation FROM students; ``` 结果:先根据性别分支,再在内部根据分数细分。嵌套结构增强了逻辑表达能力,但需注意可读性 [^3]。 - **示例4:在聚合函数中使用(条件统计)** 统计不同等级的学生人数: ```sql SELECT COUNT(*) AS total, SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) AS pass_count, SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail_count FROM students; ``` 结果:计算及格和不及格人数。此方式避免了多次查询,提升了效率 [^4]。 #### 4. **注意事项** - **性能优化**:CASE WHEN在大型数据集上可能影响性能。建议在WHERE子句中先过滤数据,减少计算量。 - **跨数据库兼容性**:语法在MySQL、PostgreSQLSQL Server等主流数据库中基本一致,但细微差异(如NULL处理)需注意。 - **常见错误**:忘记END关键字或ELSE子句可能导致语法错误或意外NULL值。始终测试查询逻辑 [^2]。 CASE WHEN语句是SQL中处理条件分支的首选工具,适用于报表生成、数据清洗等场景。通过合理使用,可以显著提升查询的灵活性和可维护性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值