当前位置: 首页 > ds >正文

SQL实战:01之行转列实现

文章目录

  • 概述
  • 语法
    • IF的使用语法
    • CASE WHEN 使用语法
  • 行转列场景
    • 题目:重新格式话部门表
    • 题解

概述

我们在工作中遇到的很多场景需要将数据表中的一行的值转为一列的值,为实现这种场景可以通过IF函数或者CASE WHEN的方式来实现。恰好本人最近在刷题,就以碰到的LeetCode中的题 为例子来讲解如何使用IF和 CASE WHEN 实现行转列。

语法

IF的使用语法

IF是一个函数,有三个参数,第一个参数是判断条件,第二个参数是条件成立时的取值,第三个参数是条件不成立时的取值。

IF(条件, 值1, 值2 )

除此以外,IF还可以嵌套使用,在一些复杂的多分支场景中就可以通过嵌套的方式来实现。

IF(条件, 值1, IF( 条件, 值1, 值2 ) )

CASE WHEN 使用语法

CASE WHEN 条件  THEN 操作WHEN 条件  THEN 操作……ELSE 操作
END

和IF一样,CASE WHEN 也可以嵌套使用,但是得注意,每个CASE WHEN都需要保持完整。

CASE WHEN 条件  THEN 操作WHEN 条件  THEN 操作……ELSE CASE WHEN 子条件 THEN 操作ELSE 操作 END
END

行转列场景

题目:重新格式话部门表

表 Department:+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| revenue       | int     |
| month         | varchar |
+---------------+---------+
在 SQL 中,(id, month) 是表的联合主键。
这个表格有关于每个部门每月收入的信息。
月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。重新格式化表格,使得 每个月 都有一个部门 id 列和一个收入列。以 任意顺序 返回结果表。结果格式如以下示例所示。示例 1:输入:
Department table:
+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 9000    | Jan   |
| 3    | 10000   | Feb   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
+------+---------+-------+
输出:
+------+-------------+-------------+-------------+-----+-------------+
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1    | 8000        | 7000        | 6000        | ... | null        |
| 2    | 9000        | null        | null        | ... | null        |
| 3    | null        | 10000       | null        | ... | null        |
+------+-------------+-------------+-------------+-----+-------------+
解释:四月到十二月的收入为空。 
请注意,结果表共有 13 列(1 列用于部门 ID,其余 12 列用于各个月份)。

题解

  • 使用IF函数实现
select id,SUM(IF(month='Jan',revenue,NULL)) AS Jan_Revenue,SUM(IF(month='Feb',revenue,NULL)) AS Feb_Revenue,SUM(IF(month='Mar',revenue,NULL)) AS Mar_Revenue,SUM(IF(month='Apr',revenue,NULL)) AS Apr_Revenue,SUM(IF(month='May',revenue,NULL)) AS May_Revenue,SUM(IF(month='Jun',revenue,NULL)) AS Jun_Revenue,SUM(IF(month='Jul',revenue,NULL)) AS Jul_Revenue,SUM(IF(month='Aug',revenue,NULL)) AS Aug_Revenue,SUM(IF(month='Sep',revenue,NULL)) AS Sep_Revenue,SUM(IF(month='Oct',revenue,NULL)) AS Oct_Revenue,SUM(IF(month='Nov',revenue,NULL)) AS Nov_Revenue,SUM(IF(month='Dec',revenue,NULL)) AS Dec_Revenue
from Department
group by id;
  • 使用CASE WHEN实现
select id,SUM(CASE WHEN month='Jan' THEN revenue ELSE NULL END) AS Jan_Revenue,SUM(CASE WHEN month='Feb' THEN revenue ELSE NULL END) AS Feb_Revenue,SUM(CASE WHEN month='Mar' THEN revenue ELSE NULL END) AS Mar_Revenue,SUM(CASE WHEN month='Apr' THEN revenue ELSE NULL END) AS Apr_Revenue,SUM(CASE WHEN month='May' THEN revenue ELSE NULL END) AS May_Revenue,SUM(CASE WHEN month='Jun' THEN revenue ELSE NULL END) AS Jun_Revenue,SUM(CASE WHEN month='Jul' THEN revenue ELSE NULL END) AS Jul_Revenue,SUM(CASE WHEN month='Aug' THEN revenue ELSE NULL END) AS Aug_Revenue,SUM(CASE WHEN month='Sep' THEN revenue ELSE NULL END) AS Sep_Revenue,SUM(CASE WHEN month='Oct' THEN revenue ELSE NULL END) AS Oct_Revenue,SUM(CASE WHEN month='Nov' THEN revenue ELSE NULL END) AS Nov_Revenue,SUM(CASE WHEN month='Dec' THEN revenue ELSE NULL END) AS Dec_Revenue
from Department
group by id;

由以上两种实现方式可以看出,IF 比 CASE WHEN的实现方式看起来更加简洁,所以如果可以使用IF函数来实现的,都可以采用IF函数来实现,避免代码的臃肿。

http://www.xdnf.cn/news/1738.html

相关文章:

  • 【学习笔记】文件包含漏洞--相关习题
  • mybatis log convert使用
  • 手动实现legend 与 echarts图交互 通过js事件实现图标某项的高亮 显示与隐藏
  • Yocto meta-toradex-security layer 创建独立数据分区
  • HTML邮件背景图兼容 Outlook
  • 避免事件“穿透”——Vue 中事件冒泡的理解与解决方案
  • AD16如何设置布线规则
  • JAVA聚焦OutOfMemoryError 异常
  • Spring Cloud Gateway配置双向SSL认证(完整指南)
  • 商显行业革新者:RK3588的8K显示技术如何打造沉浸式商业体验
  • JW01三合一传感器详解(STM32)
  • nextjs国际化
  • 【Rust结构体】Rust结构体详解:从基础到高级应用
  • Linux环境下安装PostgreSQL详细步骤
  • Tailwind CSS 初学者入门指南:项目集成,主要变更内容!
  • LLM学习笔记4——本地部署Docker、vLLM和Qwen2.5-32B-Instruct实现OpenManus的使用
  • JDK(java)安装及配置 --- app笔记
  • Matlab 基于共面螺旋管或共面亥姆霍兹谐振器的超薄低频吸声板
  • Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理
  • 【JavaScript】`Object` 对象静态方法详解
  • 怎样记忆Precision、Recall?
  • [特殊字符][特殊字符] HarmonyOS相关实现原理聊聊![特殊字符][特殊字符]
  • 【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI
  • 乡村治理数字化平台:信息技术赋能乡村振兴的深度探索
  • 数据结构-选择排序(Python)
  • QT创建软件登录界面(14)
  • JavaScript 的“世界模型”:深入理解对象 (Objects)
  • 理解欧拉公式
  • 弄清C语言中的链表
  • 济南国网数字化培训班学习笔记-第二组-1节-输电线路工程