Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dynamiczne zapytanie przestawne przy użyciu SQL Developer Oracle

Jesteś na dobrej drodze, ale ta sprawa kończy się niepowodzeniem, gdy dla co najmniej jednego ucznia zdefiniowano więcej niż jedną klasę. ROW_NUMBER() funkcja analityczna w ramach rozwiązania problemu. Więc utwórz zapisaną funkcję zawierającą 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;
/

Załóżmy, że wstawiono jeszcze jeden rekord;

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

następnie wywołaj

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

od Programisty SQL wiersza poleceń, aby zobaczyć zestaw wyników, który będzie wyglądał następująco:

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

    



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL do wygenerowania listy liczb od 1 do 100

  2. ORA-01861:literał nie pasuje do ciągu formatu

  3. Metoda gromadzenia:procedura DELETE w bazie danych Oracle

  4. Jak przenieść plik z jednego katalogu do drugiego za pomocą PL SQL?

  5. atomowe porównywanie i zamiana w bazie danych