sql >> Databasteknik >  >> RDS >> Oracle

Dynamisk pivotfråga med SQL Developer Oracle

Du är på rätt väg men det fallet misslyckas när mer än en klass definieras för minst en elev. En ROW_NUMBER() analytisk funktion inom löser problemet. Så skapa en lagrad 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;
/

Anta att det finns ytterligare en post infogat;

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

åberopa sedan

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

från SQL-utvecklare s kommandorad för att se resultatuppsättningen som blir:

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

    



  1. EF Core GroupBy med Select Distinct Count

  2. Hur man tar bort posterna baserat på föregående och nästa rader och tilldelar datum baserat på vissa villkor

  3. Oracle Critical Patch Update – oktober 2020

  4. Hur ska jag använda en Postgresql docker image/container?