sql >> Databáze >  >> RDS >> Oracle

Dynamický kontingenční dotaz pomocí SQL Developer Oracle

Jste na správné cestě, ale tento případ selže, když je pro alespoň jednoho studenta definováno více než jedna třída. A ROW_NUMBER() analytická funkce v rámci řeší problém. Vytvořte tedy uloženou funkci včetně 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;
/

Předpokládejme, že je vložen ještě jeden záznam;

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

pak vyvolejte

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

od SQL Developer Příkazový řádek 's, abyste viděli sadu výsledků, která bude :

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

    



  1. json_encode vrací hodnoty dalších řádků - PHP PDO SQL HighCharts

  2. Porovnání nabídek Galera Cluster Cloud:Část třetí Microsoft Azure

  3. MariaDB přichází do města ve vašem okolí!

  4. Postgresql k-nejbližší soused (KNN) na vícerozměrné krychli