sql >> Database >  >> RDS >> Oracle

Dynamic Pivot Query met SQL Developer Oracle

Je bent op de goede weg, maar dat geval mislukt wanneer er meer dan één klas is gedefinieerd voor ten minste één student. Een ROW_NUMBER() analytische functie binnen lost het probleem op. Maak dus een opgeslagen functie inclusief SYS_REFCURSOR :

CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
  recordset SYS_REFCURSOR;
  sqlqry    VARCHAR2(32767);
  cols      VARCHAR2(32767);
BEGIN
  SELECT LISTAGG(''''||name||''' AS "'||name||'"' ,',') WITHIN GROUP (ORDER BY 0)
    INTO cols
    FROM ( SELECT DISTINCT name FROM Students );  

  sqlqry :=
  'SELECT *
     FROM 
     (
      SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,
             s.*             
        FROM Students s     
      )
    PIVOT (
           MAX(class) FOR name IN ('||cols||')
           )
    ORDER BY rn';

  OPEN recordset FOR sqlqry;
  RETURN recordset;
END;
/

Stel dat er nog een record is ingevoegd;

Name     School    Class
----     ------    -------
Jim      Hs        History

roep dan

. op
VAR rc REFCURSOR
EXEC :rc := get_student_rs;
PRINT rc

van SQL-ontwikkelaar 's Command Line om de resultatenset te zien die zal zijn:

RN  SCHOOL  Jim      John     Matthew  Steve
--  ------  -------  -------  -------  ------
1   Hs      Maths    English  Science  Maths
2   Hs      History 

    



  1. Cumulatieve som over dagen

  2. PHP, MySQL, SELECT-vraag

  3. Hoe kan ik een array met booleaanse waarden opslaan in een MySql-database?

  4. Zend de realtime MySQL-databasetabelgegevens uit