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 Fiddle उदाहरण: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;