Il tuo primo errore sembra essere semplice. Secondo il 2° parametro del crosstab()
funzione, 'Dubai'
deve venire come prima città (ordinata per città). Dettagli:
I valori imprevisti per totalsales
e totalamount
rappresentano i valori dalla prima riga per ogni name
gruppo. Le colonne "Extra" sono trattate in questo modo. Dettagli:
Per ottenere somme per name
, esegui le funzioni della finestra sulle tue funzioni aggregate. Dettagli:
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
);
Meglio ancora, fornisci un set statico come 2° parametro. Le colonne di output sono hardcoded, potrebbe non essere affidabile generare colonne di dati in modo dinamico. Se fai un'altra riga con una nuova città, questo si interromperà.
In questo modo puoi anche ordinare le tue colonne come preferisci. Tieni sincronizzate le colonne di output e il 2° parametro.