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 totalsales
và totalamount
đạ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.