到标题 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
你的桌子。一种选择是将MAX
与CASE
一起使用:
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 的列值的主要内容,如果未能解决你的问题,请参考以下文章