列值为oracle的标题

Jij*_* PK 3 sql oracle pivot oracle11g

我有一个表格如下图所示

Empid   Field Type  Field Value
123         Name          John
123         Age            33
124         Name          Tijo
124         Age            24
Run Code Online (Sandbox Code Playgroud)

输出应采用以下格式

Empid       Name             Age
123         John             33
124         Tijo             24
Run Code Online (Sandbox Code Playgroud)

如何使用oracle数据库中的查询实现此操作?

Tar*_*ryn 6

这种类型的行转换为列称为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)
);
Run Code Online (Sandbox Code Playgroud)

请参阅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;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

您还可以通过多次加入表格来获得结果:

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';
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.每个版本都给出了结果:

| EMPID | NAME | AGE |
----------------------
|   123 | John |  33 |
|   124 | Tijo |  24 |
Run Code Online (Sandbox Code Playgroud)