sql >> Database teknologi >  >> RDS >> Oracle

Dynamisk pivotforespørgsel ved hjælp af SQL Developer Oracle

Du er på rette vej, men den sag mislykkes, når mere end én klasse er defineret for mindst én elev. En ROW_NUMBER() analytisk funktion indenfor løser problemet. Så opret en gemt funktion inklusive 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;
/
 

Antag, at der er indsat en post mere;

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

derefter påberåbe

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

fra SQL-udvikler 's kommandolinje for at se resultatsættet, som bliver:

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


  1. Vælg alle undtagen den seneste række

  2. ALL_PROCEDURES-visningen viser ikke PROCEDURE_NAME

  3. Valg af de forskellige værdier fra tre kolonner med maks. en fjerde, hvor der er dubletter

  4. Betinget i MYSQL where klausul