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

Số lượng và tổng không hợp lệ trong truy vấn tab chéo sử dụng PostgreSQL

Sai lầm đầu tiên của bạn có vẻ là đơn giản. Theo tham số thứ 2 của crosstab() hàm, 'Dubai' phải đến là thành phố đầu tiên (sắp xếp theo thành phố). Chi tiết:

Các giá trị không mong muốn cho totalsalestotalamount đại diện cho các giá trị từ hàng đầu tiên cho mỗi name tập đoàn. Các cột "phụ" được xử lý như vậy. Chi tiết:

Để nhận tổng cho mỗi name , chạy các chức năng cửa sổ trên các chức năng tổng hợp của bạn. Chi tiết:

select * from crosstab (
   'select name
          ,sum(count(*))   OVER (PARTITION BY name)
          ,sum(sum(price)) OVER (PARTITION BY name)
          ,city
          ,count(city)
    from   products
    group  by name,city
    order  by name,city
    '
--  ,'select distinct city from products order by 1' -- replaced
    ,$$SELECT unnest('{Dubai,London,Melborun
                      ,Moscow,Munich,Shunghai}'::varchar[])$$
) AS tb (
    name varchar(20), TotalSales bigint, TotalAmount bigint
   ,Dubai bigint
   ,London bigint
   ,Melborun bigint
   ,Moscow bigint
   ,Munich bigint
   ,Shunghai bigint
   );

Tốt hơn, hãy cung cấp một tập hợp tĩnh làm tham số thứ 2. Các cột đầu ra được mã hóa cứng, có thể không đáng tin cậy để tạo các cột dữ liệu động. Nếu bạn là một hàng khác với một thành phố mới, điều này sẽ bị phá vỡ.
Bằng cách này, bạn cũng có thể sắp xếp các cột của mình theo ý muốn. Chỉ cần giữ đồng bộ các cột đầu ra và tham số thứ 2.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm giá trị không chứa số trong PostgreSQL

  2. Làm cách nào để xóa các dấu ngoặc kép khỏi một bảng trong postgresql?

  3. Viết một tệp bằng nhiều chuỗi

  4. Gây ra bởi:org.hibernate.MappingException:Cột lặp lại trong ánh xạ cho thực thể

  5. Chuyển đổi tệp kết xuất SQLITE SQL sang POSTGRESQL