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

Dynamicznie generuj kolumny w PostgreSQL

Podstawowe zapytanie krzyżowe dla Twojego przykładu jest proste:

SELECT * FROM crosstab(
       'SELECT zoom, day, point
        FROM   province
        ORDER  BY 1, 2'

     , $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);

Ale nie z dynamicznymi nazwami kolumn lub dynamiczną liczbą kolumn. Jako kompromis możesz mieć stałą liczbę kolumn i wypełniać tylko te wiodące. Podstawy:

  • Kwerendy PostgreSQL Crosstab

Dynamiczny?

crosstab_hash nie pomoże ci z dynamicznymi nazwami kolumn. Służy do wielokrotnego użytku bez wpisywania listy definicji kolumn, ale nie do dynamicznego nazwy kolumn. Przykłady:

  • Dynamicznie generuj kolumny dla tabeli krzyżowej w PostgreSQL
  • Sql:transpozycja wierszy na kolumny

Aby uzyskać naprawdę dynamiczne nazwy kolumn, potrzebujesz dwóch wycieczki w obie strony na serwer. Niezależnie od tego, czy pobierasz nazwy kolumn za pomocą pierwszego zapytania, aby zbudować drugie, czy tworzysz kursor, tabelę tymczasową lub przygotowaną instrukcję. Cokolwiek spróbujesz, potrzebujesz dwóch podróży w obie strony. SQL chce znać typ zwracany w czasie połączenia.

Najbardziej zbliżone do wywołania „dynamicznego” jest moja niestandardowa crosstab_n() funkcja zdefiniowana w tej powiązanej odpowiedzi:

  • Dynamiczna alternatywa dla pivota z CASE i GROUP BY

Albo rezygnujesz z całkowicie dynamicznego zapytania krzyżowego (bo wiesz, że to niemożliwe) i używasz dwuetapowego przepływu pracy, jak wspomniano powyżej.

  1. Niech funkcja wygeneruje tekst zapytania krzyżowego. Możesz skorzystać z funkcji udostępnionej tutaj (i dostosować ją do swoich potrzeb!):

    • Wykonaj dynamiczne zapytanie krzyżowe

    W szczególności usuń GROUP BY 1, 2 , ponieważ nie agregujesz wierszy przed tabelą krzyżową.

  2. Wykonaj wygenerowaną funkcję.

Dla kompletności dostępny jest również nowy \crosstabview metakomenda w psql w Postgresie 9.6 (właśnie wydany) - o podobnej funkcjonalności i może wyświetlać dynamiczne nazwy kolumn (dołączanie dynamicznych nazw odbywa się w kliencie psql, a nie w serwerze Postgres).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja MIN() w PostgreSQL

  2. Czy mogę użyć zwracanej wartości INSERT...RETURNING w innej INSERT?

  3. CTE i paradoks urodzin

  4. Zarejestruj się i uruchom PostgreSQL 9.0 jako usługę Windows

  5. Sekwencje, na które nie mają wpływu transakcje?