Khó khăn đặc biệt là dữ liệu của bạn chưa sẵn sàng để lập bảng chéo. Bạn cần dữ liệu ở dạng row_name , danh mục , giá trị . Bạn có thể có được điều đó với UNION
truy vấn:
SELECT 'metric1' AS metric, country_code, metric1 FROM tbl1
UNION ALL
SELECT 'metric2' AS metric, country_code, metric2 FROM tbl1
UNION ALL
SELECT 'metric3' AS metric, country_code, metric3 FROM tbl1
ORDER BY 1, 2 DESC;
Nhưng một LATERAL
thông minh truy vấn chỉ cần một lần quét bảng và sẽ nhanh hơn:
SELECT x.metric, t.country_code, x.val
FROM tbl1 t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC;
Có liên quan:
Sử dụng dạng đơn giản của crosstab()
với 1 tham số với truy vấn này làm đầu vào:
SELECT * FROM crosstab(
$$SELECT x.metric, t.country_code, x.val
FROM tbl1 t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC$$
)
AS ct (metric text, us int, uk int, fr int);
Liệt kê tên quốc gia theo thứ tự giảm dần trong bảng chữ cái (như trong bản trình diễn của bạn). Điều này cũng giả định rằng tất cả các chỉ số đều được xác định NOT NULL
.
Nếu một hoặc cả hai không phải là trường hợp, hãy sử dụng biểu mẫu 2 tham số để thay thế:
Thêm "bản tổng hợp"
I E. tổng trên mỗi số liệu:
SELECT * FROM crosstab(
$$SELECT x.metric, t.country_code, x.val
FROM (
TABLE tbl1
UNION ALL
SELECT 'zzz_total', sum(metric1)::int, sum(metric2)::int, sum(metric3)::int -- etc.
FROM tbl1
) t
, LATERAL (VALUES
('metric1', metric1)
, ('metric2', metric2)
, ('metric3', metric3)
) x(metric, val)
ORDER BY 1, 2 DESC$$
)
AS ct (metric text, total int, us int, uk int, fr int);
'zzz_total'
là một nhãn tùy ý, phải sắp xếp cuối cùng theo thứ tự bảng chữ cái (hoặc bạn cần dạng 2 tham số của crosstab()
).
Nếu bạn có nhiều trong số các cột số liệu, bạn có thể muốn tạo chuỗi truy vấn động. Có liên quan:
- Làm cách nào để thực hiện tổng hợp giống nhau trên mọi cột mà không cần liệt kê các cột?
- Thực thi động truy vấn trong PL / pgSQL
Cũng xin lưu ý rằng Postgres 9.5 sắp tới (hiện đang là phiên bản beta) giới thiệu Mệnh đề SQL cho ROLLUP
.
Liên quan: