sql - Oracle SQL开发人员: How to transpose rows to columns using PIVOT function

标签 sql oracle pivot oracle9i

我正在尝试创建一个查询,以使用PIVOT函数将行转置为列。

这是我要转置为行的contact表:

   PARTYID CONTACTTEXT  CONTACTTYPECD
---------- ------------ -------------
       100 0354441010               1
       100 0355551010               2
       100 0428105789               3
       100 abc@home.com             4

我的预期结果:
   PARTYID PHONE        FAX          MOBILE       EMAIL      
---------- ------------ ------------ ------------ ------------
       100 0354441010   0355551010   0428105789   abc@home.com

我的查询:
SELECT * FROM 
  ( 
    SELECT partyId, contacttext, contacttypecd 
    FROM CONTACT 
    WHERE partyId = 100; 
  ) 
  PIVOT ( 
    MAX(contacttext) 
  FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email)); 

我遇到的错误:
Error starting at line 9 in command: 
FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email)) 
Error report: 
Unknown Command 

我出现问题的原因是因为我的Oracle数据库版本(Oracle9i)不支持PIVOT功能。以下是以另一种方式进行操作的方法:
SELECT PartyCD
  ,MAX(DECODE(t.contacttypecd, 1, t.contacttext)) Phone
  ,MAX(DECODE(t.contacttypecd, 2, t.contacttext)) Fax
  ,MAX(DECODE(t.contacttypecd, 3, t.contacttext)) Mobile
  ,MAX(DECODE(t.contacttypecd, 4, t.contacttext)) Email
FROM 
  (
    SELECT partyid, contacttext, contacttypecd
    FROM CONTACT
    WHERE partyid = 100
  ) t
 GROUP BY PartyID

最佳答案

在以下情况中,您的陈述中有一个冒号的分号:

    WHERE partyId = 100; 

将其删除以使其成为:
SELECT * FROM 
  ( 
    SELECT partyId, contacttext, contacttypecd 
    FROM CONTACT 
    WHERE partyId = 100
  ) 
  PIVOT ( 
    MAX(contacttext) 
  FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email));

   PARTYID PHONE        FAX          MOBILE       EMAIL      
---------- ------------ ------------ ------------ ------------
       100 0354441010   0355551010   0428105789   abc@home.com

它被视为多个语句;第一个是不完整的,因为它缺少右括号(因此得到ORA-00907),第二个从该括号开始并得到了您报告的错误,然后每行都得到相同的错误。您似乎只是在查看上一次报告的错误-从第一个错误开始,将其清除,然后继续存在下一个错误,通常会更有帮助。

关于sql - Oracle SQL开发人员: How to transpose rows to columns using PIVOT function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29945504/

相关文章:

mysql - 如何在 MySQL 中返回数据透视表输出?

sql - COMMIT会做什么?

sql-server - SQL Server 2008 垂直数据到水平数据

sql - 每当将项目添加到 Service Broker 队列时,如何执行存储过程?

sql - T-SQL 2008 中的 REPLACE 函数与 T-SQL 2005 不同

sql - 以编程方式更改数据库连接

java - Hibernate 不想加载 Oracle 驱动程序

python - Pandas 数据框从长到宽转换,每个索引的行数不同

sql - 通过 SQL 语句获取表和列的定义

mysql - 如何存储元数据数据类型