Je eerste fout lijkt eenvoudig te zijn. Volgens de 2e parameter van de crosstab()
functie, 'Dubai'
moet als eerste stad komen (gesorteerd op stad). Details:
De onverwachte waarden voor totalsales
en totalamount
vertegenwoordigen waarden uit de eerste rij voor elke name
groep. "Extra" kolommen worden zo behandeld. Details:
Om sommen te krijgen per name
, voer vensterfuncties uit over uw aggregatiefuncties. Details:
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
);
Beter nog, geef een statische set op als 2e parameter. Uitvoerkolommen zijn hard gecodeerd, het kan onbetrouwbaar zijn om gegevenskolommen dynamisch te genereren. Als je een andere rij met een nieuwe stad zou maken, zou deze breken.
Op deze manier kun je ook je kolommen ordenen zoals je wilt. Houd de uitvoerkolommen en de 2e parameter gesynchroniseerd.