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

PostgreSQL řádek do sloupců

Za prvé, crosstab() rodina funkcí není ve standardním PostgreSQL nainstalována. Je třeba nainstalovat rozšíření tablefunc pro tohle. V PostgreSQL 9.1 byste jednoduše:

CREATE EXTENSION tablefunc;

Pro starší verze se podívejte na tuto související odpověď.

Dotaz

Dotaz může vypadat takto:

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

Používám tvar crosstab() se dvěma parametry, protože to umožňuje chybějící atributy. Jako když člověk nemá e-mail. Poté tento formulář vrátí NULL pro email sloupec. Podrobné vysvětlení:

  • PostgreSQL Crosstab Query

Funkce

Nebo vytvořte funkci, abyste nemuseli pro každé volání dodávat seznam definic sloupců:

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;

Volejte:

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. AKTUALIZACE Statistik

  2. Problém Android SQLite - tabulka ... nemá žádný sloupec pojmenovaný

  3. Existuje v Oracle funkce, která vypočítá rozdíl mezi dvěma daty?

  4. Vyberte bez klauzule FROM v Oracle