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

Ugyldigt antal og sum i krydsfaneforespørgsel ved brug af PostgreSQL

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.



  1. SQL:Afbryder en forespørgsel

  2. RPostgreSQL - R-forbindelse til Amazon Redshift - Sådan SKRIVER/Send større datasæt

  3. Kan jeg bruge CASE-erklæringen i en JOIN-tilstand?

  4. SQL - Procedure kolonnefejl