Truy vấn bảng chéo cơ bản cho ví dụ của bạn rất đơn giản:
SELECT * FROM crosstab(
'SELECT zoom, day, point
FROM province
ORDER BY 1, 2'
, $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);
Nhưng không với tên cột động hoặc số lượng cột động. Như một sự thỏa hiệp, bạn có thể có một số lượng cột cố định và chỉ điền vào những cột đứng đầu. Khái niệm cơ bản:
- Truy vấn bảng chéo PostgreSQL
Động?
crosstab_hash
sẽ không giúp bạn với tên cột động. Nó để sử dụng nhiều lần mà không cần nhập danh sách định nghĩa cột, nhưng không dùng cho động tên các cột. Ví dụ:
- Tự động tạo các cột cho bảng chéo trong PostgreSQL
- Sql:Chuyển các hàng thành cột
Đối với tên cột thực sự động, bạn cần có hai các chuyến đi vòng quanh máy chủ. Cho dù bạn truy xuất tên cột bằng truy vấn đầu tiên để tạo truy vấn thứ hai, hay bạn tạo con trỏ hoặc bảng tạm thời hoặc một câu lệnh đã chuẩn bị. Dù bạn cố gắng, bạn cần hai chuyến đi khứ hồi. SQL muốn biết kiểu trả về tại thời điểm gọi.
Cách gần nhất mà tôi có thể nhận được lệnh gọi "động" là với crosstab_n()
tùy chỉnh của tôi chức năng được xác định trong câu trả lời liên quan này:
- Thay thế động cho trục xoay với CASE và GROUP BY
Hoặc bạn từ bỏ ý định truy vấn bảng chéo động hoàn toàn (bởi vì bạn biết đấy, điều đó là không thể) và sử dụng quy trình làm việc hai bước, như đã đề cập ở trên.
-
Để một hàm tạo văn bản truy vấn bảng chéo. Bạn có thể sử dụng chức năng được cung cấp tại đây (và điều chỉnh nó theo nhu cầu của bạn!):
- Thực thi một truy vấn bảng chéo động
Đặc biệt, hãy xóa
GROUP BY 1, 2
, vì bạn không tổng hợp các hàng trước khi lập bảng chéo. -
Thực thi chức năng đã tạo.
Để hoàn thiện, còn có \crosstabview
mới metacommand trong psql trong Postgres 9.6 (vừa được phát hành) - với chức năng tương tự và nó có thể hiển thị tên cột động (việc đính kèm tên động xảy ra trong máy khách psql, không phải trong máy chủ Postgres).