sql >> Database >  >> RDS >> PostgreSQL

Ongeldige telling en som in kruistabelquery met PostgreSQL

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.



  1. Hoe kan ik een enkele rij vergrendelen in Oracle SQL?

  2. MySQL-triggers kunnen geen rijen bijwerken in dezelfde tabel waaraan de trigger is toegewezen. Voorgestelde oplossing?

  3. Een database verbinden met Python

  4. postgreSQL - psql \i:hoe script in een bepaald pad uit te voeren