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

Chuyển tùy ý nhiều hàng thành cột trong PostgreSQL

Vấn đề chính với bảng tổng hợp trong Postgres (và các RDBMS khác) là cấu trúc (số lượng và tên các cột) của kết quả truy vấn không thể thay đổi tùy thuộc vào dữ liệu đã chọn. Một trong những giải pháp khả thi là tạo chế độ xem động, cấu trúc được xác định bởi dữ liệu. Hàm ví dụ tạo một dạng xem dựa trên bảng example_table :

create or replace function create_pivot_view()
returns void language plpgsql as $$
declare
    list text;
begin
    select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
    from (
        select distinct name
        from example_table
        ) sub
    into list;

    execute format($f$
        drop view if exists example_pivot_view;
        create view example_pivot_view as
        select lbl, %s
        from (
            select lbl, json_object_agg(name, value) jdata
            from example_table
            group by 1
            order by 1
            ) sub
        $f$, list);
end $$;

Sử dụng hàm sau khi bảng được sửa đổi (có thể trong trình kích hoạt) và truy vấn chế độ xem đã tạo:

select create_pivot_view();

select *
from example_pivot_view;

 lbl | num | colour | percentage 
-----+-----+--------+------------
   1 | 1   | Red    | 25.0
   2 | 2   | Green  | 50.0
   3 | 3   | Blue   | 75.0
(3 rows)

Kiểm tra nó trong db <> fiddle.

Lưu ý rằng cần tạo lại một dạng xem (gọi hàm) chỉ sau khi một tên mới được thêm vào bảng (hoặc một số tên bị xóa khỏi nó). Nếu tập hợp các tên riêng biệt không thay đổi, bạn có thể truy vấn chế độ xem mà không cần tạo lại. Nếu tập hợp được sửa đổi thường xuyên thì việc tạo một chế độ xem tạm thời sẽ là một lựa chọn tốt hơn.

Bạn cũng có thể quan tâm đến Làm phẳng các cặp khóa / giá trị tổng hợp từ trường JSONB?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt Tiện ích mở rộng PostgreSQL cho tất cả các lược đồ

  2. Có gì mới trong PostgreSQL 12

  3. Việc gọi hàm hoặc thủ tục đã lưu trữ sẽ không chèn và vẫn tiếp tục các thay đổi

  4. Hàm PDO và pg_ *

  5. PostgreSQL Streaming Replication - Deep Dive