PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara melakukan agregasi yang sama pada setiap kolom, tanpa mencantumkan kolom?

Anda memerlukan SQL dinamis untuk itu, yang berarti Anda harus membuat fungsi atau menjalankan DO memerintah. Karena Anda tidak dapat mengembalikan nilai secara langsung dari yang terakhir, fungsi plpgsql itu:

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

Telepon:

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

Pengembalian:

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

Penjelasan lebih lanjut dan tautan tentang SQL dinamis dan EXECUTE dalam pertanyaan terkait ini - atau beberapa lagi di sini di SO, coba penelusuran ini.

Sangat mirip dengan pertanyaan ini:
postgresql - hitung (tidak ada nilai nol) setiap kolom dalam tabel

Anda bahkan dapat mencoba dan mengembalikan tipe rekaman polimorfik untuk mendapatkan kolom tunggal secara dinamis, tetapi itu agak rumit dan canggih. Mungkin terlalu banyak usaha untuk kasus Anda. Selengkapnya di jawaban terkait ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:perintah vakum tidak membersihkan tupel yang mati

  2. Blok kode anonim PL/pgSQL

  3. dapatkan catatan tiga bulan terakhir dari tabel

  4. Kueri N baris terkait terakhir per baris

  5. Pola &Pengubah Template untuk Pemformatan Numerik di PostgreSQL