PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nieprawidłowa liczba i suma w zapytaniu krzyżowym przy użyciu PostgreSQL

Twój pierwszy błąd wydaje się prosty. Zgodnie z drugim parametrem crosstab() funkcja, 'Dubai' musi pojawić się jako pierwsze miasto (posortowane według miasta). Szczegóły:

Nieoczekiwane wartości dla totalsales i totalamount reprezentują wartości z pierwszego wiersza dla każdej name Grupa. W ten sposób traktowane są kolumny „Dodatkowe”. Szczegóły:

Aby uzyskać kwoty według name , uruchom funkcje okna na funkcjach agregujących. Szczegóły:

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
   );

Jeszcze lepiej, podaj zestaw statyczny jako drugi parametr. Kolumny wyjściowe są zakodowane na stałe, dynamiczne generowanie kolumn danych może być zawodne. Jeśli utworzysz kolejny wiersz z nowym miastem, to się zepsuje.
W ten sposób możesz również uporządkować kolumny według własnego uznania. Po prostu zsynchronizuj kolumny wyjściowe i drugi parametr.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz json z wartościami kolumn jako kluczami obiektów

  2. Postgres, aby pobrać listę z wartościami oddzielonymi przecinkami

  3. Napraw „BŁĄD:każde zapytanie INTERSECT musi mieć taką samą liczbę kolumn” w PostgreSQL

  4. Kolory w wierszu polecenia psql

  5. Postgres pl/pgsql BŁĄD:kolumna nazwa_kolumny nie istnieje