Kesalahan pertama Anda tampaknya sederhana. Menurut parameter ke-2 dari crosstab()
fungsi, 'Dubai'
harus datang sebagai kota pertama (diurutkan berdasarkan kota). Detail:
Nilai tak terduga untuk totalsales
dan totalamount
mewakili nilai dari baris pertama untuk setiap name
kelompok. Kolom "Ekstra" diperlakukan seperti itu. Detail:
Untuk mendapatkan jumlah per name
, jalankan fungsi jendela di atas fungsi agregat Anda. Detail:
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
);
Lebih baik lagi, berikan set statis sebagai parameter ke-2. Kolom keluaran dikodekan secara keras, mungkin tidak dapat diandalkan untuk menghasilkan kolom data secara dinamis. Jika Anda baris lain dengan kota baru, ini akan rusak.
Dengan cara ini Anda juga dapat mengurutkan kolom sesuka Anda. Tetap sinkronkan kolom output dan parameter ke-2.