3

我有一个架构如下的表

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

输出应采用以下格式

Empid       Name             Age
123         John             33
124         Tijo             24

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

4

2 回答 2

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)
);

请参阅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

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

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 |
于 2013-04-24T16:50:49.323 回答
4

听起来你正在尝试PIVOT你的桌子。一种选择是使用MAXwith 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 小提琴演示

于 2013-04-24T16:49:07.970 回答