Oracle
 sql >> база данни >  >> RDS >> Oracle

Динамична Pivot Query с помощта на Sql Developer Oracle

Вие сте на прав път, но този случай се проваля, когато повече от един клас е дефиниран за поне един ученик. A ROW_NUMBER() аналитична функция в рамките разрешава проблема. И така, създайте съхранена функция, включително 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;
/

Да предположим, че има вмъкнат още един запис;

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

след това извикайте

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

от SQL разработчик командния ред, за да видите набора от резултати, който ще бъде:

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. Някакво въздействие върху производителността в Oracle за използване LIKE 'string' vs ='string'?

  2. Oracle SQL вмъкване в with With клауза

  3. Как да копирам или импортирам схеми на Oracle между две различни бази данни на различни сървъри?

  4. Форматиране на изход на заявки в SQLPlus

  5. ORA-01008:не всички променливи са обвързани, когато всички са обвързани