Din første fejl ser ud til at være enkel. Ifølge den 2. parameter i crosstab()
funktion, 'Dubai'
skal komme som første by (sorteret efter by). Detaljer:
De uventede værdier for totalsales
og totalamount
repræsentere værdier fra den første række for hvert name
gruppe. "Ekstra" kolonner behandles sådan. Detaljer:
For at få beløb pr. name
, kør vinduesfunktioner over dine samlede funktioner. Detaljer:
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
);
Endnu bedre, angiv et statisk sæt som 2. parameter. Outputkolonner er hårdkodede, det kan være upålideligt at generere datakolonner dynamisk. Hvis du åbner en anden række med en ny by, vil denne gå i stykker.
På denne måde kan du også bestille dine kolonner, som du vil. Bare hold outputkolonner og 2. parameter synkroniseret.