Bạn không thể có tổng hợp "động" vì số lượng, tên và kiểu dữ liệu của tất cả các cột của truy vấn phải được cơ sở dữ liệu trước truy vấn thực sự được thực thi (tức là tại thời điểm phân tích cú pháp).
Tôi thấy việc tổng hợp mọi thứ vào một JSON dễ xử lý hơn.
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
Nếu giao diện người dùng của bạn có thể xử lý trực tiếp các giá trị JSON, bạn có thể dừng ở đây.
Nếu bạn thực sự cần một chế độ xem với một cột cho mỗi thuộc tính, bạn có thể xem chúng từ giá trị JSON:
select customer_number,
props ->> 'address' as address,
props ->> 'phone' as phone,
props ->> 'email' as email
from (
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t
Tôi thấy điều này dễ quản lý hơn một chút khi các thuộc tính mới được thêm vào.
Nếu bạn cần một dạng xem với tất cả các nhãn, bạn có thể tạo một thủ tục được lưu trữ để tạo động nó. Nếu số lượng nhãn khác nhau không thay đổi quá thường xuyên, đây có thể là một giải pháp:
create procedure create_customer_view()
as
$$
declare
l_sql text;
l_columns text;
begin
select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
into l_columns
from the_table;
l_sql :=
'create view customer_properties as
select customer_number, '||l_columns||'
from (
select customer_number, jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t';
execute l_sql;
end;
$$
language plpgsql;
Sau đó, tạo chế độ xem bằng:
call create_customer_view();
Và trong mã của bạn, chỉ cần sử dụng:
select *
from customer_properties;
Bạn có thể lập lịch để thủ tục đó chạy trong các khoảng thời gian đều đặn (ví dụ:thông qua cron
công việc trên Linux)