Mysql行列转换,利用case when then

本文分享了一道高频出现的SQL面试题及其解答。题目要求查询指定表中按年份和季度分组的销售量数据,并展示如何使用CASE WHEN语句和SUM函数实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个SQL题在面试中出现的概率极高,最近有学生出去面试仍然会遇到这样的题目,在这里跟大家分享一下。

题目:数据库中有一张如下所示的表,表名为sales。

季度销售量
1991111
1991212
1991313
1991414
1992121
1992222
1992323
1992424



要求:写一个SQL语句查询出如下所示的结果。

一季度二季度三季度四季度
199111121314
199221222324



我给出的答案是这样的:

select 年, 
sum(case when 季度=1 then 销售量 else 0 end) as 一季度, 
sum(case when 季度=2 then 销售量 else 0 end) as 二季度, 
sum(case when 季度=3 then 销售量 else 0 end) as 三季度, 
sum(case when 季度=4 then 销售量 else 0 end) as 四季度 
from sales group by 年;
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
### MySQLCASE WHEN THEN 语句详解 #### 理解 CASE WHEN THEN 结构 在 MySQL 查询中,`CASE WHEN THEN` 提供了一种灵活的方式来实现条件判断逻辑。这种结构允许基于不同条件返回特定值,类似于编程中的 `if-else` 控制流。 #### 基本语法形式 最简单的 `CASE` 表达式可以写作: ```sql CASE column_name WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default_result END AS alias_column ``` 此表达式的含义是在给定列等于指定值时返回相应结果;如果都不匹配,则返回默认结果[^1]。 对于更复杂的多条件判断场景,推荐使用带有布尔表达式的完整版 `CASE`: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END AS alias_column ``` 这里可以根据任意有效的 SQL 条件表达式来进行分支选择[^4]。 #### 实际应用案例分析 ##### 场景一:简单 Case 函数转换性别描述 假设有一个名为 `users` 的表,其中包含用户的 ID 和性别编码(0表示女性, 1表示男性)。为了使报告更加友好易读,可以通过 `CASE` 将这些数值映射为人可理解的文字说明: ```sql SELECT id, CASE gender_code WHEN 0 THEN 'Female' WHEN 1 THEN 'Male' ELSE 'Unknown' END as gender_description FROM users; ``` 这段代码会遍历每一行记录并根据 `gender_code` 字段的内容设置新的别名列 `gender_description`。 ##### 场景二:解决排名问题 考虑一个销售数据集,想要计算每位销售人员在其部门内的相对业绩位置。通过组合窗口函数与 `CASE` 可以轻松完成这一任务: ```sql WITH ranked_sales AS ( SELECT employee_id, department, sales_amount, RANK() OVER (PARTITION BY department ORDER BY sales_amount DESC) rank_num FROM sales_data ) SELECT *, CASE WHEN rank_num = 1 THEN 'Top Performer' WHEN rank_num BETWEEN 2 AND 5 THEN 'Good Performance' ELSE 'Needs Improvement' END performance_level FROM ranked_sales; ``` 上述查询首先利用窗口功能为各部门成员按销售额降序排列赋予等级编号,接着再依据该编号分配绩效评价标签[^2]。 ##### 场景三:动态调整显示内容 有时可能希望根据不同业务规则改变某些字段的表现方式而不影响原始存储的数据。比如在一个订单系统里,针对状态码做个性化提示信息展示: ```sql SELECT order_number, status_code, CASE WHEN status_code IN ('PENDING', 'PROCESSING') THEN CONCAT('Your Order ', order_number, ' is being processed.') WHEN status_code = 'SHIPPED' THEN CONCAT('Order ', order_number, ' has been shipped and will arrive soon!') ELSE 'Thank you for your purchase!' END message_to_customer FROM orders; ``` 这样就可以向客户发送定制化的通知消息而无需修改数据库内实际的状态标记。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值