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

PostgreSQL wiersz do kolumn

Po pierwsze, crosstab() rodzina funkcji nie jest instalowana w standardowym PostgreSQL. Musisz zainstalować rozszerzenie tablefunc dla tego. W PostgreSQL 9.1 po prostu:

CREATE EXTENSION tablefunc;

W przypadku starszych wersji spójrz na tę powiązaną odpowiedź.

Zapytanie

Zapytanie może wyglądać tak:

SELECT *
FROM   crosstab (
        'SELECT l.id
               ,c.column_name
               ,c.data
         FROM   custom_columns_table c
         JOIN   list_table l ON l.id = c.list_id
         ORDER  BY 1',

        'SELECT DISTINCT column_name
         FROM   custom_columns_table
         ORDER  BY 1')
AS tbl (
    id integer
   ,email text
   ,name text
   );

Używam formy crosstab() z dwoma parametrami, ponieważ pozwala to na brakujące atrybuty. Na przykład, gdy dana osoba nie ma adresu e-mail. Wtedy ten formularz zwróci NULL dla email kolumna. Szczegółowe wyjaśnienie:

  • Kwerendy PostgreSQL Crosstab

Funkcja

Lub utwórz funkcję, aby nie trzeba było podawać listy definicji kolumn dla każdego wywołania:

CREATE OR REPLACE FUNCTION f_mycross(text, text)
  RETURNS TABLE (
    id integer
   ,email text
   ,name text)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Zadzwoń:

SELECT * FROM f_mycross(
       'SELECT l.id
              ,c.column_name
              ,c.data
        FROM   custom_columns_table c
        JOIN   list_table l ON l.id = c.list_id
        ORDER  BY 1',
    
       'SELECT DISTINCT column_name
        FROM   custom_columns_table
        ORDER  BY 1')



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PSQLException:bieżąca transakcja jest przerwana, polecenia ignorowane do końca bloku transakcji

  2. java.lang.ClassNotFoundException:org.postgresql.Driver

  3. Deklarowanie struktury krotki rekordu w PL/pgSQL

  4. Kilka pomysłów na niskopoziomowe pulowanie zasobów w PostgreSQL

  5. Jak tworzyć dynamiczne deklaracje postgresowe w PHP