Twój pierwszy błąd wydaje się prosty. Zgodnie z drugim parametrem crosstab()
funkcja, 'Dubai'
musi pojawić się jako pierwsze miasto (posortowane według miasta). Szczegóły:
Nieoczekiwane wartości dla totalsales
i totalamount
reprezentują wartości z pierwszego wiersza dla każdej name
Grupa. W ten sposób traktowane są kolumny „Dodatkowe”. Szczegóły:
Aby uzyskać kwoty według name
, uruchom funkcje okna na funkcjach agregujących. Szczegóły:
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
);
Jeszcze lepiej, podaj zestaw statyczny jako drugi parametr. Kolumny wyjściowe są zakodowane na stałe, dynamiczne generowanie kolumn danych może być zawodne. Jeśli utworzysz kolejny wiersz z nowym miastem, to się zepsuje.
W ten sposób możesz również uporządkować kolumny według własnego uznania. Po prostu zsynchronizuj kolumny wyjściowe i drugi parametr.