sql >> Databáze >  >> RDS >> PostgreSQL

Neplatný počet a součet v křížovém dotazu pomocí PostgreSQL

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.



  1. Jak získám seznam všech tabulek v databázi pomocí TSQL?

  2. classNotFoundException při načítání ovladače JDBC

  3. Určení OID tabulky v Postgres 9.1?

  4. Jaký je nejlepší způsob, jak svázat desetinné / dvojité / plovoucí hodnoty s PDO v PHP?