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

Xoay vòng trên Oracle 10g

Trong Oracle 10g, không có PIVOT nhưng bạn có thể sao chép nó bằng cách sử dụng tổng hợp với CASE :

select usr,
  sum(case when tp ='T1' then cnt else 0 end) T1,
  sum(case when tp ='T2' then cnt else 0 end) T2,
  sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;

Xem SQL Fiddle với Demo

Nếu bạn có Oracle 11g + thì bạn có thể sử dụng PIVOT chức năng:

select *
from temp
pivot
(
  sum(cnt)
  for tp in ('T1', 'T2', 'T3')
) piv

Xem SQL Fiddle với Demo

Nếu bạn có một số lượng giá trị không xác định để chuyển đổi, thì bạn có thể tạo một thủ tục để tạo một phiên bản động của cái này:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select usr ';

    begin
        for x in (select distinct tp from temp order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from temp group by usr';

        open p_cursor for sql_query;
    end;
/

sau đó để thực thi mã:

variable x refcursor
exec dynamic_pivot(:x)
print x

Kết quả cho tất cả các phiên bản là như nhau:

| USR | T1 | T2 | T3 |
----------------------
|   1 | 17 |  0 |  0 |
|   2 |  0 | 21 |  1 |
|   3 | 45 |  0 |  0 |

Chỉnh sửa:Dựa trên nhận xét của bạn nếu bạn muốn Total , cách dễ nhất là đặt truy vấn bên trong một SELECT khác tương tự như sau:

select usr,
  T1 + T2 + T3 as Total,
  T1,
  T2,
  T3
from
(
  select usr,
    sum(case when tp ='T1' then cnt else 0 end) T1,
    sum(case when tp ='T2' then cnt else 0 end) T2,
    sum(case when tp ='T3' then cnt else 0 end) T3
  from temp
  group by usr
) src;

Xem SQL Fiddle với Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thủ tục lưu trữ Oracle:trả về cả tham số đặt và ra kết quả

  2. Bảng đang thay đổi, trình kích hoạt / chức năng có thể không nhìn thấy nó (ngăn điểm trung bình giảm xuống dưới 2,5)

  3. SID khác với tên dịch vụ như thế nào trong Oracle tnsnames.ora

  4. Hiểu kết quả của Kế hoạch Giải thích Thực thi trong Nhà phát triển SQL Oracle

  5. Mệnh đề GIỮA so với <=AND> =