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

oracle:Tên cột động

Vì bạn đang sử dụng Oracle10g nên không có PIVOT vì vậy bạn sẽ phải thực hiện kiểu chuyển đổi này bằng cách sử dụng hàm tổng hợp với CASE tuyên bố.

Nếu các giá trị được biết trước, thì bạn có thể mã hóa chúng trong phiên bản tĩnh:

select s.ts_location,
  sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
  sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
  sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
from tbl_sales s
inner join tbl_products p
  on s.ts_tp_id = p.tp_id
group by s.ts_location

Xem SQL Fiddle with Demo

Nhưng nếu các giá trị của bạn không được biết trước, thì bạn phải triển khai sql động và trong Oracle, bạn sẽ muốn sử dụng một thủ tục cho việc này:

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

    begin
        for x in (select distinct tp_name from tbl_products order by 1)
        loop
            sql_query := sql_query ||
                ' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from tbl_sales s 
                                                inner join tbl_products p
                                                  on s.ts_tp_id = p.tp_id
                                                group by s.ts_location';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

Sau đó, để trả về kết quả, bạn có thể sử dụng ( ghi chú: đây là cách tôi thực hiện trong Toad):

variable x refcursor
exec dynamic_pivot(:x)
print x

Cả hai sẽ trả về kết quả:

| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
|          LN |     0 |    10 |        35 |
|          QL |    25 |     0 |        20 |
|          NY |   100 |     5 |        50 |



  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ỗi với OracleDataReader. Lỗi:Hoạt động không hợp lệ. Kết nối đã bị đóng

  2. Làm thế nào để tránh truy vấn rất nặng này làm chậm ứng dụng?

  3. Trong Oracle SQL, tại sao các hàng đã xóa (không cam kết) không hiển thị trong phiên hiện tại nhưng lại hiển thị trong các phiên khác?

  4. Dapper - gọi Oracle schema.package. Chức năng

  5. Triển khai trang web ASP.NET với ODP.NET