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

生成された列を使用したPostgreSQLクエリ

    select 
    t1.name,
    sum(case when t2.abbrev='foo' then t1.amount*t2.amount else 0 end) as foo,
    sum(case when t2.abbrev='bar' then t1.amount*t2.amount else 0 end) as bar,
    sum(case when t2.abbrev='baz' then t1.amount*t2.amount else 0 end) as baz
    from usage t1 inner join points t2 on t1.points_id=t2.ident
    group by t1.name;
    

    SQLフィドルの例: http://sqlfiddle.com/#!15/cc84a/6 ;

    動的な場合には、次のPostgreSQL関数を使用します。

    create or replace function sp_test()
    returns void as
    $$
    
    declare cases character varying;
    declare sql_statement text;
    begin
    
    select string_agg(concat('sum(case when t2.abbrev=','''',abbrev,'''',' then t1.amount*t2.amount else 0 end) as ', abbrev),',') into cases from points;
    
    drop table if exists temp_data;
    
    sql_statement=concat('create temporary table temp_data as select 
    t1.name,',cases ,' 
    from usage t1 inner join points t2 on t1.points_id=t2.ident
    group by t1.name ');
    
    execute sql_statement;
    
    end;
    $$
    language 'plpgsql';
    

    関数は一時テーブルを使用して動的列データを格納します。

    次の方法で関数を呼び出してデータを取得します:

    select * from sp_test(); select * from temp_data;




    1. クエリセットobjをパラメータとして渡すときにCeleryがエラーを発生させる

    2. Empty($ _ POST)のデフォルト値を設定するにはどうすればよいですか?

    3. PHP/MySQLのようなボタン

    4. Yiiの関連モデルのプロパティを検証します