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

Postgres - Chuyển đổi hàng thành cột

Sử dụng crosstab() từ mô-đun tablefunc.

SELECT * FROM crosstab(
   $$SELECT user_id, user_name, rn, email_address
     FROM  (
        SELECT u.user_id, u.user_name, e.email_address
             , row_number() OVER (PARTITION BY u.user_id
                            ORDER BY e.creation_date DESC NULLS LAST) AS rn
        FROM   usr u
        LEFT   JOIN email_tbl e USING (user_id)
        ) sub
     WHERE  rn < 4
     ORDER  BY user_id
   $$
  , 'VALUES (1),(2),(3)'
   ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);

Tôi đã sử dụng báo giá đô la cho tham số đầu tiên, không có ý nghĩa đặc biệt. Thật tiện lợi khi thoát khỏi các dấu nháy đơn trong chuỗi truy vấn, đây là trường hợp phổ biến:

  • Chèn văn bản với các dấu ngoặc kép trong PostgreSQL

Giải thích và hướng dẫn chi tiết:

  • Truy vấn bảng chéo PostgreSQL

Và đặc biệt, đối với "cột phụ":

  • Xoay vòng trên nhiều cột bằng cách sử dụng Tablefunc

Những khó khăn đặc biệt đây là:

  • Thiếu tên khóa.
    -> Chúng tôi thay thế bằng row_number() trong một truy vấn con.

  • Số lượng email khác nhau.
    -> Chúng tôi giới hạn ở mức tối đa của ba trong SELECT bên ngoài
    và sử dụng crosstab() với hai tham số, cung cấp danh sách các khóa khả thi.

Chú ý đến NULLS LAST trong ORDER BY .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ST_DWithin nhận tham số là độ, không phải mét, tại sao?

  2. Ràng buộc bảng chéo trong PostgreSQL

  3. Cách tính tổng nhiều cột trong PostgreSQL

  4. Câu lệnh Postgresql đơn giản - tên cột không tồn tại

  5. Làm thế nào để ép kiểu mảng json sang mảng văn bản?