SQL 将多列的数据转到一列
时间:2022-07-24
本文章向大家介绍SQL 将多列的数据转到一列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如题。假设我们要把 emp 表中的 ename、job 和 sal 字段的值整合到一列中,每个员工的数据(按照 ename -> job -> sal 的顺序展示)是紧挨在一块,员工之间使用空行隔开。
由于篇幅有限,这里只拿 deptno = 10 的数据来做演示。期望返回的结果如下:
emps
-----------
CLARK
MANAGER
2450
(NULL)
KING
PRESIDENT
5000
(NULL)
MILLER
CLERK
1300
(NULL)
解决方案
将多列的数据整合到一列展示可以使用 UNION ALL
,只是 UNION ALL
适合数据量比较少且数据固定的场景。一旦增加员工数据或者删除员工数据,UNION ALL
的写法将不再适用。
使用 case when 条件1成立 then ename when 条件2成立 then job when 条件3成立 then sal end
可以将多列的数据放到一列中展示,一行数据过 case when
转换后最多只会出来一个列的值,要使得同一个员工的数据能依次满足 case when
的条件,就需要复制多份数据,有多个条件就要生成多少份数据。判断是否加空行也是 case when
中的条件,因此每个员工的数据都要生成 4 份。
使用笛卡尔积可以"复制"出多份数据,再对这些相同的数据编号(1-4),编号就作为 case when
的判断条件。
完整的SQL 如下:
SELECT
CASE
rn
WHEN 1
THEN ename
WHEN 2
THEN job
WHEN 3
THEN CAST(sal AS CHAR(4))
END emps
FROM
(SELECT
e.ename,
e.job,
e.sal,
row_number () over (
PARTITION BY e.empno
ORDER BY e.empno
) rn
FROM
emp e,
(SELECT
NULL
FROM
emp
LIMIT 4) four_rows
WHERE e.deptno = 10) t
不管用什么方式造数据,只要确保派生表 four_rows 的数据只有 4 行就行。
如果使用的数据库不支持窗口函数呢?在 MySQL 里可以使用用户变量,使用用户变量只是模拟了窗口函数的实现,并没有什么新意。
我们可从派生表下手,把本该由窗口函数生成序号的任务交给派生表,这样就不需要窗口函数了。
SELECT
CASE
rn
WHEN 1
THEN ename
WHEN 2
THEN job
WHEN 3
THEN CAST(sal AS CHAR(4))
END emps
FROM
(SELECT
e.empno,
e.ename,
e.job,
e.sal,
four_rows.rn
FROM
emp e,
(SELECT
1 AS rn
UNION
SELECT
2
UNION
SELECT
3
UNION
SELECT
4) four_rows
WHERE e.deptno = 10) t
ORDER BY empno,
rn
封面图由 Mikhail Lebedev 在 Pixabay 上发布
- Android Firebase 服务简介
- CVE-2015-0393:Oracle发布严重安全漏洞预警
- 研究人员发现一种利用Siri窃取苹果iPhone/iPad数据的方法
- 关于Python中的__main__和编程模板
- 世界大战尽在掌控:盘点全球网络攻击实时追踪系统
- Activity数据传递
- apache反向代理一、泛解析域名二、APACHE配置
- Python学习 - 可视化变量赋值、循环、程序运行过程
- jdk源码分析红黑树——插入篇1.插入root2.父黑3.父红4.父红,叔红5.1父红,叔黑,外侧子孙5.2父红,叔黑,内侧子孙
- WIFI环境下Android手机和电脑通信
- 破解之美:利用ECB加密缺陷突破cookie加密
- 让Python猜猜你是否能约会成功
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 实现一个简单的JS效果
- 1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!
- Mysql支持远程链接访问
- linux shell编程
- Linux下的I/O复用与epoll详解
- 时间序列&日期学习笔记大全(上)
- LeetCode 题解:一顿操作猛如虎,一看击败百分五
- 这是什么沙雕题目?测试用例居然有人身高为 0 ??
- 深入解读flink sql cdc的使用以及源码分析
- markdown mermaid 画图
- 面试汇总(五):操作系统常见面试总结(一):进程与线程的相关知识点
- 面试汇总(六):操作系统常见面试总结(二):系统相关的问题
- Android 利用V4L2 调用camera
- Android基础--利用ANativeWindow显示视频
- Python如何爬取b站热门视频并导入Excel