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