2

I want to make a dynamic pivot on pgsql table

Original table :

time strategy pnl
1 a 100
2 a 200
3 a 300
1 b 1000
2 b 2000
1 c 22

target table :

time sum a b c
1 1132 100 1000 32
2 2200 200 2000 0
3 22 0 0 22

the problem that the strategy content is dynamic i can have sometimes over 40 unique values (in this example there are only 3 a,b,c )

i have the following code it looks like a good start but the are some problems i cannot solve

SELECT time,
      --sum(case when strategy='a' then pnl else 0 end) AS "a" ,
      --sum(case when strategy='b' then pnl else 0 end) AS "b" ,
      --sum(case when strategy='c' then pnl else 0 end) AS "c"

      --generate the contect above, (when using the code above the function works)
       (SELECT string_agg(clause, ',')
        FROM (SELECT format('sum(case when strategy=''%s'' then pnl else 0 end) AS "%s" ',
                            strategy, strategy) AS clause
              FROM (SELECT DISTINCT strategy FROM server_logs.logs where strategy != '' and subclass = 'pnl') s
              ORDER BY strategy) clauses)
FROM (
select  case when strategy is null then 'system' else strategy end as strategy,
       time,
       sum(case when value::float!=0  then 0::float else value::float end) as pnl
      FROM server_logs.logs
        where subclass='pnl'
        group by rollup(strategy), time
  ) as t
group by time
order by time desc
;
Ilia
  • 534
  • 3
  • 21

0 Answers0