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

Yêu cầu truy vấn chuyển vị bảng chéo

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:

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 9.3:Cách chèn UUID viết hoa vào bảng

  2. Tôi lấy nguồn libpq ở đâu?

  3. mã hóa UTF8 không khớp với ngôn ngữ en_US; cài đặt LC_CTYPE đã chọn yêu cầu mã hóa LATIN1

  4. Cách sao chép câu lệnh INSERT / UPDATE / DELETE bằng JPA và Hibernate

  5. Lỗi khi nhập CSV vào postgres với python và psycopg2