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.
-
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ą. -
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).