web-dev-qa-db-fra.com

Oracle SQL Developer: comment transposer des lignes en colonnes à l'aide de la fonction PIVOT

J'essaie de créer une requête pour transposer des lignes en colonnes à l'aide de la fonction PIVOT.

Voici la table contact que je souhaite transposer en lignes:

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

Mon résultat escompté:

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

Ma requête:

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

Erreurs que je reçois:

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

La raison de mon problème était que ma version de base de données Oracle (Oracle9i) ne prenait pas en charge la fonction PIVOT. Voici comment procéder différemment:

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

Vous avez un point-virgule errant dans votre déclaration, après:

    WHERE partyId = 100; 

Supprimez cela pour le faire:

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]

Il est considéré comme plusieurs déclarations; la première est incomplète car il manque une parenthèse fermante (obtient donc ORA-00907), la seconde commence par cette parenthèse et obtient l'erreur que vous avez signalée, puis chaque ligne suivante obtient la même erreur. Il semble que vous ne regardiez que la dernière erreur signalée - il est généralement beaucoup plus utile de commencer par la première erreur, de la supprimer et de passer à la suivante si elle existe toujours.

13
Alex Poole