在 PostgreSQL 中将行转置为列

Transpose rows into column in PostgreSQL

这是我当前的 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

这是我当前的输出,还有一个理想的输出。

如何调整此查询以获得所需的输出?

您可以使用 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 形式的连接 - 它可以确保连接的所有部分都正确连接。

更新:

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