0

Here is my current PostgreSQL query:

 SELECT     
        c.ce_new_cat_short, 
        d.ver_desc_txt, 
        c.product_type, 
        round(sum(d.profit_amt/f.exch_rate)::numeric, 2) AS dp_dol, 
        sum(d.unit_qty) AS units
 FROM       
        ext_ce.gsam_v_data_detail as d
        LEFT JOIN
            (SELECT DISTINCT g.prmry_prfl_cd, g.wrkhrs_grp, g.brnd_fmly_desc_txt_adj FROM ext_ce.gsam_v_data_context AS g) AS vc
        ON vc.prmry_prfl_cd = d.prmry_prfl_cd,  
        ext_ce.gsam_data_context as c,
        ext_ce.info_fx_rates_v2 as f
 WHERE      
        c.product_type <> 'SALES AIDS'::text 
        AND c.cncpt_nr::numeric = d.prmry_prfl_cd
        AND f.offr_cmpgn_yr_nr = 2017
        AND d.mrkt_desc_txt = f.mrkt_desc_txt
 GROUP BY   
        c.ce_new_cat_short,  
        d.ver_desc_txt, 
        c.product_type;

I'm stuck trying to transpose column ver_desc_txt.

Here is my current output, alongside a desirable one.

Current and desired output

How can I adjust this query to get the desirable output?

Obsidian Age
  • 41,205
  • 10
  • 48
  • 71
Bartek
  • 13
  • 1
  • 8
  • Possible duplicate of [Postgres - Transpose Rows to Columns](http://stackoverflow.com/questions/23060256/postgres-transpose-rows-to-columns) – Ricardo C Mar 02 '17 at 21:21

1 Answers1

0

You can use FILTER clause to limit aggregate functions:

SELECT     
        c.ce_new_cat_short, 
        c.product_type, 
        round(sum(CASE WHEN d.ver_desc_txt = 'FINAL LEADER LIST' THEN d.profit_amt/f.exch_rate ELSE 0 END)::numeric, 2) AS dp_dol_FLL, 
        round(sum(CASE WHEN d.ver_desc_txt = 'BEST OFFICAL PROJECTION' THEN d.profit_amt/f.exch_rate ELSE 0 END)::numeric, 2) AS dp_dol_BOP, 
        sum(CASE WHEN d.ver_desc_txt = 'FINAL LEADER LIST' THEN d.unit_qty ELSE 0 END) AS units_FLL,
        sum(CASE WHEN d.ver_desc_txt = 'BEST OFFICAL PROJECTION' THEN d.unit_qty ELSE 0 END) AS units_BOP
 FROM       
        ext_ce.gsam_v_data_detail as d
        JOIN ext_ce.gsam_data_context as c
            ON (c.cncpt_nr::numeric = d.prmry_prfl_cd)
        JOIN ext_ce.info_fx_rates_v2 as f
            ON ( d.mrkt_desc_txt = f.mrkt_desc_txt)
        LEFT JOIN (SELECT DISTINCT g.prmry_prfl_cd, g.wrkhrs_grp, g.brnd_fmly_desc_txt_adj FROM ext_ce.gsam_v_data_context AS g) AS vc
            ON vc.prmry_prfl_cd = d.prmry_prfl_cd
 WHERE      
        c.product_type <> 'SALES AIDS'::text 
        AND f.offr_cmpgn_yr_nr = 2017
 GROUP BY   
        1, 2

Also I would recommend you to use JOIN form of join - it allows to be assured that all part of join is joined correctly.

UPD:

For version 8.2.15 must use CASE WHERE instead FILTER

Community
  • 1
  • 1
Roman Tkachuk
  • 3,096
  • 1
  • 16
  • 15