这是我当前的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
。
这是我当前的输出,以及理想的输出。
如何调整此查询以获得理想的输出?
答案 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形式的连接 - 它可以确保连接的所有部分都正确连接。
对于版本8.2.15,必须使用CASE WHERE而不是FILTER