oracle 保留ID的转置表

z4bn682m  于 2023-01-16  发布在  Oracle
关注(0)|答案(1)|浏览(107)

我有一张长桌:
| 列1|列2|第3栏|
| - ------|- ------|- ------|
| 人员1|名|奥雷利|
| 人员1|前名|杜邦|
| 人员1|年龄|二十五|
| 人员2|名|斯特凡|
| 人员2|前名|布朗|
| 人员2|年龄|四十五|
我想把它转换成这个形状:
| 山坳|名|前名|年龄|
| - ------|- ------|- ------|- ------|
| 人员1|奥雷利|杜邦|二十五|
| 人员2|斯特凡|布朗|四十五|
我在Oracle SQL Developer中尝试了这段代码,但它不起作用:

select * 
from table as SourceTable 
pivot (max(col3) for col2 in ('nom', 'prenom', 'age'));

PS:"年龄"列为字符串
你能帮忙吗?
谢谢大家!

oxf4rvwz

oxf4rvwz1#

(Code您发布的,以及标签建议您使用Oracle数据库。下面的代码使用Oracle。)
一种选择是使用条件聚合。
样本数据:

SQL> with test (col1, col2, col3) as
  2    (select 'pers1', 'nom'   , 'Aurelie'  from dual union all
  3     select 'pers1', 'prenom', 'Dupont'   from dual union all
  4     select 'pers1', 'age'   , '25'       from dual union all
  5     --
  6     select 'pers2', 'nom'   , 'Stephane' from dual union all
  7     select 'pers2', 'prenom', 'Blanc'    from dual union all
  8     select 'pers2', 'age'   , '45'       from dual
  9    )

质询:

10  select col1,
 11    max(case when col2 = 'nom'    then col3 end) nom,
 12    max(case when col2 = 'prenom' then col3 end) prenom,
 13    max(case when col2 = 'age'    then col3 end) age
 14  from test
 15  group by col1;

COL1  NOM      PRENOM   AGE
----- -------- -------- --------
pers1 Aurelie  Dupont   25
pers2 Stephane Blanc    45

SQL>

或者,旋转-正如您尝试的那样:

10  select *
 11  from test
 12  pivot (max(col3) for col2 in ('nom', 'prenom', 'age'));

COL1  'nom'    'prenom' 'age'
----- -------- -------- --------
pers1 Aurelie  Dupont   25
pers2 Stephane Blanc    45

SQL>

您评论说将age作为字符串有问题;它肯定是一个字符串,因为COL3包含 * names *,所以它不可能是NUMBER数据类型列。

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               CHAR(5)
 COL2                                               VARCHAR2(6)
 COL3                                               VARCHAR2(8)

SQL> select * from test;

COL1  COL2   COL3
----- ------ --------
pers1 nom    Aurelie
pers1 prenom Dupont
pers1 age    25
pers2 nom    Stephane
pers2 prenom Blanc
pers2 age    45

6 rows selected.

SQL> select *
  2  from test
  3  pivot (max(col3) for col2 in ('nom', 'prenom', 'age'));

COL1  'nom'    'prenom' 'age'
----- -------- -------- --------
pers1 Aurelie  Dupont   25
pers2 Stephane Blanc    45

SQL>

相关问题