web-dev-qa-db-ja.com

Oracle SQL Developer:PIVOT関数を使用して行を列に転置する方法

PIVOT関数を使用して、行を列に転置するクエリを作成しようとしています。

これは、行に転置したいcontactテーブルです:

   PARTYID CONTACTTEXT  CONTACTTYPECD
---------- ------------ -------------
       100 0354441010               1
       100 0355551010               2
       100 0428105789               3
       100 [email protected]             4

私の意図した結果:

   PARTYID PHONE        FAX          MOBILE       EMAIL      
---------- ------------ ------------ ------------ ------------
       100 0354441010   0355551010   0428105789   [email protected]

私のクエリ:

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
6
user1309226

あなたの声明には、次のような迷いセミコロンがあります:

    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   [email protected]

複数のステートメントとして見られています。最初の括弧は閉じ括弧がないため(ORA-00907を取得)、2番目はその括弧で始まり、報告されたエラーを取得し、その後の各行は同じエラーを取得します。あなたは最後に報告されたエラーだけを見ているようです-通常、最初のエラーから始めてそれをクリアし、それがまだ存在する場合は次のエラーに移動する方がはるかに便利です。

13
Alex Poole