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

postgresで不明な行の値を列名に動的に転置する

    クエリのすべての列の数、名前、データ型は前にデータベースに認識されている必要があるため、「動的」ピボットを設定することはできません。 クエリは実際に実行されます(つまり、解析時に)。

    ものをJSONに集約する方が扱いやすいと思います。

    select customer_number,
           jsonb_object_agg(label, value) as props
    from the_table
    group by customer_number
    

    フロントエンドがJSON値を直接処理できる場合は、ここで停止できます。

    属性ごとに1つの列を持つビューが本当に必要な場合は、JSON値からそれらを取得できます:

    select customer_number, 
           props ->> 'address' as address,
           props ->> 'phone' as phone,
           props ->> 'email' as email
    from (       
      select customer_number,
             jsonb_object_agg(label, value) as props
      from the_table
      group by customer_number
    ) t
    

    新しい属性が追加されたときに、これを管理するのが少し簡単だと思います。

    すべてのラベルを含むビューが必要な場合は、ストアドプロシージャを作成して動的に作成できます。異なるラベルの数があまり頻繁に変更されない場合、これは解決策である可能性があります:

    create procedure create_customer_view() 
    as
    $$
    declare
      l_sql text;
      l_columns text;
    begin
      select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
        into l_columns
      from the_table;
      
      l_sql := 
        'create view customer_properties as 
         select customer_number, '||l_columns||' 
         from (
          select customer_number, jsonb_object_agg(label, value) as props
           from the_table 
           group by customer_number 
         ) t';
      execute l_sql;
    end;
    $$
    language plpgsql;
    

    次に、以下を使用してビューを作成します:

    call create_customer_view();  
    

    そして、あなたのコードでは、以下を使用してください:

    select *
    from customer_properties;
    

    そのプロシージャを定期的に実行するようにスケジュールできます(例:cron Linuxでの仕事)



    1. IDを昇順でテーブルにデータを保存します

    2. 定期的なイベント、SQLクエリ

    3. OracleのNVL2()関数

    4. IN演算子を使用してjsonb配列をクエリする方法