sql >> データベース >  >> RDS >> PostgreSQL

列を一覧表示せずに、すべての列で同じ集計を実行するにはどうすればよいですか?

    動的SQLが必要です そのためには、関数を作成するか、DOを実行する必要があります。 指図。後者から直接値を返すことはできないため、plpgsql関数 それは:

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

    電話:

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

    返品:

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

    動的SQLとEXECUTEに関する詳細な説明とリンク この関連する質問で-またはここSOでさらにいくつか、この調査を試してください。

    この質問と非常によく似ています:
    postgresql-テーブルの各列のカウント(null値なし)

    多態的なレコードタイプを返して単一の列を動的に取得することもできますが、それはかなり複雑で高度です。おそらくあなたのケースにはあまりにも多くの努力が必要です。この関連する回答の詳細。




    1. すべての中小企業がデータベースを必要とする理由

    2. PyMySQLはローカルホスト上のMySQLに接続できません

    3. すべての雇用者が採用すべき7つの優れた技術習慣

    4. オプティマイザーがバッファープールの知識を使用しない理由