sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo escribir SQL en Oracle en mi caso?

Necesitas usar el PIVOT estándar consulta.

Según la versión de la base de datos de Oracle , puedes hacerlo de dos formas:

Uso de PIVOT para versión 11g y arriba:

SQL> SELECT *
  2  FROM
  3    (SELECT c.place place,
  4      row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
  5      (row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
  6      COUNT(place) OVER(ORDER BY NULL))*100 pct
  7    FROM person_injuryPlace_map A
  8    JOIN person b
  9    ON(A.person_id = b.ID)
 10    JOIN injury_place c
 11    ON(A.injury_id = c.ID)
 12    ORDER BY c.place
 13    ) PIVOT (MAX(cnt),
 14             MAX(pct) pct
 15             FOR (place) IN ('kitchen' AS kitchen,
 16                             'Washroom' AS Washroom,
 17                             'Rooftop' AS Rooftop,
 18                             'Garden' AS Garden));

   KITCHEN KITCHEN_PCT   WASHROOM WASHROOM_PCT    ROOFTOP ROOFTOP_PCT     GARDEN GARDEN_PCT
---------- ----------- ---------- ------------ ---------- ----------- ---------- ----------
         1  14.2857143          3   42.8571429          1  14.2857143          2 28.5714286

Usando MAX y DECODIFICAR para versión 10g y antes:

SQL> SELECT MAX(DECODE(t.place,'kitchen',cnt)) Kitchen ,
  2    MAX(DECODE(t.place,'kitchen',pct)) Pct ,
  3    MAX(DECODE(t.place,'Washroom',cnt)) Washroom ,
  4    MAX(DECODE(t.place,'Washroom',pct)) Pct ,
  5    MAX(DECODE(t.place,'Rooftop',cnt)) Rooftop ,
  6    MAX(DECODE(t.place,'Rooftop',pct)) Pct ,
  7    MAX(DECODE(t.place,'Garden',cnt)) Garden ,
  8    MAX(DECODE(t.place,'Garden',pct)) Pct
  9  FROM
 10    (SELECT b.ID bid,
 11      b.NAME NAME,
 12      c.ID cid,
 13      c.place place,
 14      row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
 15      ROUND((row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
 16      COUNT(place) OVER(ORDER BY NULL))*100, 2) pct
 17    FROM person_injuryPlace_map A
 18    JOIN person b
 19    ON(A.person_id = b.ID)
 20    JOIN injury_place c
 21    ON(A.injury_id = c.ID)
 22    ORDER BY c.place
 23    ) t;

   KITCHEN        PCT   WASHROOM        PCT    ROOFTOP        PCT     GARDEN        PCT
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         1      14.29          3      42.86          1      14.29          2      28.57