PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Conteggio e somma non validi nella query a schede incrociate utilizzando PostgreSQL

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.