Oracle SQL 数据透视表从一列变为两列

Posted

技术标签:

【中文标题】Oracle SQL 数据透视表从一列变为两列【英文标题】:Oracle SQL Pivot Table from one column into two columns 【发布时间】:2019-12-31 17:18:55 【问题描述】:

我有一个包含两列 PersonId 和 Job 的表,需要根据表中的三个作业将 Job 列转换为多个列。然后,如果 PersonId 与该职位相关联,则每个职位都应在列中显示“是”或“否”。

示例表:

示例输出:

【问题讨论】:

(1) 用您正在使用的数据库标记您的问题。 (2) 解释“动态”标签。 【参考方案1】:

使用条件聚合:

select personid,
  max(case when job = 'a' then 'yes' else 'no' end) as a,
  max(case when job = 'b' then 'yes' else 'no' end) as b,
  max(case when job = 'c' then 'yes' else 'no' end) as c
from tablename
group by personid

请参阅demo。 结果:

| personid | a   | b   | c   |
| -------- | --- | --- | --- |
| 1        | yes | yes | no  |
| 2        | yes | no  | no  |
| 3        | no  | no  | yes |

【讨论】:

感谢您的建议!你知道为什么我在运行它时可能会收到错误“FROM 关键字未在预期的地方找到”吗?这是我正在使用的以下代码:选择 emplid, max(case when acad_career = 'UGRD' then 'yes' else 'no' end) as 'UGRD', max(case when acad_career = 'GRAD' then 'yes' else 'no' end) as 'GRAD', max(case when acad_career = 'CERT' then 'yes' else 'no' end) as 'CERT' FROM (select distinct emplid, acad_career from sysadm.adtl) group by emplid跨度> 这是一个 Oracle 错误。检查编辑的演示链接。 删除别名 UGRD、GRAD 和 CERT 周围的单引号。 这就是问题所在,删除它们后它起作用了。谢谢!

以上是关于Oracle SQL 数据透视表从一列变为两列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql根据其他列的条件从一列中获取数据

将数据从一列插入另一个表的两列的过程

Oracle PL/SQL 和 Shell 脚本:从一种模式到另一种模式

是否有可能在Oracle中有条件地透视不同数据类型的列?

SQL语句,字段表里某列数据变为用逗号分隔的字符串

sql 里 怎么把一列的值合并成一个字符串