Vaše první chyba se zdá být jednoduchá. Podle 2. parametru crosstab()
funkce, 'Dubai'
musí přijít jako první město (řazeno podle města). Podrobnosti:
Neočekávané hodnoty pro totalsales
a totalamount
představují hodnoty z prvního řádku pro každý name
skupina. Sloupce "Extra" jsou takto ošetřeny. Podrobnosti:
Chcete-li získat součty za name
, spouštějte funkce okna přes vaše agregační funkce. Podrobnosti:
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
);
Ještě lépe, poskytněte statickou sadu jako 2. parametr. Výstupní sloupce jsou pevně zakódovány, může být nespolehlivé generovat datové sloupce dynamicky. Pokud byste přidali další řádek s novým městem, toto by se přerušilo.
Takto si můžete také seřadit sloupce, jak chcete. Udržujte výstupní sloupce a 2. parametr v synchronizaci.