Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

Posted

技术标签:

【中文标题】Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列【英文标题】:Oracle SQL Developer: How to transpose rows to columns using PIVOT function 【发布时间】:2015-04-29 13:39:49 【问题描述】:

我正在尝试创建一个查询以使用 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

【问题讨论】:

【参考方案1】:

你的语句中有一个杂散的分号,在:

    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),第二个以该括号开头并获取您报告的错误,然后每个后续行都得到相同的错误。您似乎只是在查看最后一个报告的错误 - 从第一个错误开始,清除它,然后如果它仍然存在,然后转到下一个错误,通常会更有帮助。

【讨论】:

我删除了 WHERE party = 100 行之后的分号,现在出现以下错误:ORA-00933: SQL command not properly ended00933. 00000 - "SQL command not properly ended"*Cause:*Action:Error at Line: 7 Column: 8 找到问题的原因:我的oracle数据库版本是Oracle9i,不支持PIVOT功能。 很可爱啊

以上是关于Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Oracle SQL Developer 导出数据?

如何使用 Oracle SQL developer 运行存储过程?

如何安装pl/sql developer

Oracle Sql Developer如何在Oracle中创建和设置角色?

如何使用 Oracle SQL Developer 打印实体关系 (ER) 图

oracle 客户端 sql developer 如何修改jdk版本