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

PostgreSQLでクロス集計用の列を動的に生成する

    提供されているC関数crosstab_hashを使用できます このために。

    マニュアルはこの点であまり明確ではありません。 crosstab()の章の最後に記載されています 2つのパラメータを使用:

    事前定義された関数を作成して、各クエリで結果の列名とタイプを書き出す必要をなくすことができます。前のセクションの例を参照してください。この形式のcrosstabの基礎となるC関数 名前はcrosstab_hash

    あなたの例:

    CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
      RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
      AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
    

    電話:

    SELECT * FROM f_cross_test_db(
          'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
         ,'SELECT DISTINCT key FROM test_db ORDER BY 1');
    

    個別のcrosstab_hashを作成する必要があることに注意してください すべてのcrosstabの関数 異なるリターンタイプの関数。

    関連:

    • PostgreSQLの行から列へ

    列リストを生成する関数 かなり複雑で、結果は正しくありません(int kernel_idの後に欠落しています )、次のSQLクエリに置き換えることができます:

    SELECT 'kernel_id int, '
           || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
           || ' int, DUMMY text'
    FROM   test_db;
    

    とにかく動的に使用することはできません。



    1. OracleのTO_YMINTERVAL()関数

    2. MySQL:2つのタイムスタンプの差を秒単位で取得する方法

    3. postgresqlデータベースに画像を挿入します

    4. Oracle11gR2のWM_CONCAT関数のセパレータを変更します