在PostgreSQL中将行转换为列

时间:2017-03-02 18:52:15

标签: sql postgresql transpose

这是我当前的PostgreSQL查询:

 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;

我试图转置column ver_desc_txt

这是我当前的输出,以及理想的输出。

Current and desired output

如何调整此查询以获得理想的输出?

1 个答案:

答案 0 :(得分:0)

您可以使用FILTER子句限制聚合函数:

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

另外,我建议您使用JOIN形式的连接 - 它可以确保连接的所有部分都正确连接。

UPD:

对于版本8.2.15,必须使用CASE WHERE而不是FILTER