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

Jak provést stejnou agregaci na každém sloupci, aniž byste uváděli sloupce?

Potřebujete dynamické SQL to znamená, že musíte vytvořit funkci nebo spustit DO příkaz. Protože nemůžete vracet hodnoty přímo z posledně jmenovaného, ​​funkce plpgsql je to:

CREATE OR REPLACE function f_count_all(_tbl text
                           , OUT columns text[], OUT counts bigint[])
  RETURNS record LANGUAGE plpgsql AS
$func$
BEGIN

EXECUTE (
    SELECT 'SELECT
     ARRAY[' || string_agg('''' || quote_ident(attname) || '''', ', ') || '], 
     ARRAY[' || string_agg('count(' || quote_ident(attname) || ')', ', ') || ']
    FROM ' || _tbl
    FROM   pg_attribute
    WHERE  attrelid = _tbl::regclass
    AND    attnum  >= 1           -- exclude tableoid & friends (neg. attnum)
    AND    attisdropped is FALSE  -- exclude deleted columns
    GROUP  BY attrelid
    )
INTO columns, counts;

END
$func$;

Volejte:

SELECT * FROM f_count_all('myschema.mytable');

Vrátí:

columns       | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}

Další vysvětlení a odkazy o dynamickém SQL a EXECUTE v této související otázce - nebo několik dalších zde na SO, zkuste toto vyhledávání.

Velmi podobné této otázce:
postgresql - počet (žádné hodnoty null) každého sloupce v tabulce

Můžete dokonce zkusit vrátit polymorfní typ záznamu, abyste získali jednotlivé sloupce dynamicky, ale to je poměrně složité a pokročilé. Pravděpodobně příliš mnoho úsilí pro váš případ. Více v této související odpovědi.




  1. SQL VIEW

  2. Monitorování protokolu transakcí

  3. Vložit do z CTE

  4. SQL Server SELECT, kde jakýkoli sloupec obsahuje 'x'