Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn Pivot động sử dụng Sql Developer Oracle

Bạn đang đi đúng hướng nhưng trường hợp đó không thành công khi có nhiều hơn một lớp được xác định cho ít nhất một học sinh. A ROW_NUMBER() chức năng phân tích bên trong giải quyết vấn đề. Vì vậy, hãy tạo một hàm được lưu trữ bao gồm 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;
/

Giả sử có thêm một bản ghi được chèn vào;

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

sau đó gọi

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

từ Nhà phát triển SQL Dòng lệnh của để xem tập hợp kết quả sẽ là:

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. Làm thế nào để thêm 2 ngày trong Oracle sp?

  2. Cách tìm ngày làm việc 48 giờ trừ thứ bảy, chủ nhật và ngày lễ trong oracle

  3. Làm thế nào để tạo toàn bộ DDL của một lược đồ Oracle (có thể tập lệnh)?

  4. Cách thực thi trình kích hoạt và thủ tục trong oracle

  5. Giới thiệu về Sao lưu cơ sở dữ liệu Oracle