到标题 oracle 的列值

Posted

技术标签:

【中文标题】到标题 oracle 的列值【英文标题】:Column values to header oracle 【发布时间】:2013-04-24 16:45:46 【问题描述】:

我有一张表,其架构如下

Empid   Field Type  Field Value
123         Name          John
123         Age            33
124         Name          Tijo
124         Age            24

输出应该是followinf格式

Empid       Name             Age
123         John             33
124         Tijo             24

如何使用来自 oracle 数据库的查询来实现这一点?

【问题讨论】:

【参考方案1】:

这种将行转换为列的类型称为 PIVOT。有几种方法可以做到这一点。

由于您使用的是 Oracle 11g,因此可以使用 PIVOT 功能:

select empid, Name, age
from
(
  select empid,
    fieldtype,
    fieldvalue
  from yt
) 
pivot
(
  max(fieldvalue)
  for fieldtype in ('Name' as Name, 'Age' as Age)
);

见SQL Fiddle with Demo。

在 Oracle 11g 之前,您可以使用带有 CASE 表达式的聚合函数:

select empid,
  max(case when fieldtype = 'Name' then fieldvalue end) name,
  max(case when fieldtype = 'Age' then fieldvalue end) age
from yt
group by empid;

见SQL Fiddle with Demo。

你也可以通过多次在表上join得到结果:

select t1.empid,
  t1.fieldvalue name,
  t2.fieldvalue age
from yt t1
left join yt t2
  on t1.empid = t2.empid
  and t2.fieldtype = 'Age'
where t1.fieldtype = 'Name';

见SQL Fiddle with Demo。每个版本都会给出结果:

| EMPID | NAME | AGE |
----------------------
|   123 | John |  33 |
|   124 | Tijo |  24 |

【讨论】:

最后一种方法仅在每个员工 ID 的字段类型中存在“名称”的情况下才有效(它适用于示例数据)。为最后一个选项引入第三个连接可能更安全。虽然(一如既往)很好地使用了 PIVOT! @sgeddes 我假设每条记录都会有一个name。 :)【参考方案2】:

听起来你正在尝试PIVOT 你的桌子。一种选择是将MAXCASE 一起使用:

select empid,
   max(case when fieldtype = 'Name' then fieldvalue end) Name,
   max(case when fieldtype = 'Age' then fieldvalue end) Age
from yourtable
group by empid

SQL Fiddle Demo

【讨论】:

@JijilPK -- np,很高兴我们能帮上忙!

以上是关于到标题 oracle 的列值的主要内容,如果未能解决你的问题,请参考以下文章

根据oracle中的列值加入表

如何在 Oracle 数据库中获取更多列值以及不同的列?

用于连接 Oracle 中多行的列值的 SQL 查询

Oracle Query - 将列值作为多个值的列标题

Oracle SQL REGEXP 用不同的列值替换特定字符串

更新之前的Oracle SQL触发器,用于设置来自其他实体的列值