前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 将多列的数据转到一列

SQL 将多列的数据转到一列

作者头像
白日梦想家
发布2020-09-08 11:30:44
5.3K0
发布2020-09-08 11:30:44
举报
文章被收录于专栏:SQL实现

如题。假设我们要把 emp 表中的 ename、job 和 sal 字段的值整合到一列中,每个员工的数据(按照 ename -> job -> sal 的顺序展示)是紧挨在一块,员工之间使用空行隔开。

由于篇幅有限,这里只拿 deptno = 10 的数据来做演示。期望返回的结果如下:

代码语言:javascript
复制
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 如下:

代码语言:javascript
复制
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 里可以使用用户变量,使用用户变量只是模拟了窗口函数的实现,并没有什么新意。

我们可从派生表下手,把本该由窗口函数生成序号的任务交给派生表,这样就不需要窗口函数了。

代码语言:javascript
复制
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 上发布

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档