You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化重复PostgreSQL代码?实现宽表转窄表的更优方案?

解决方案

针对你的两个问题,推荐用PostgreSQL的LATERAL JOIN结合VALUES子句来实现,既简化了重复代码,又完美完成宽表转窄表的需求,代码如下:

SELECT
    bea."rep_Month",
    bea."p_Code",
    bea."L1",
    bea."L2",
    bea."L3",
    bea."L4",
    bea."L5",
    bea."L6",
    v."Exp_Month",
    v."Expense"
FROM
    "B12_Expense_AB" bea
LATERAL (
    VALUES
        (DATE '2017-06-01', bea."EX_1706"),
        (DATE '2017-07-01', bea."EX_1707"),
        (DATE '2017-08-01', bea."EX_1708"),
        (DATE '2017-09-01', bea."EX_1709"),
        (DATE '2017-10-01', bea."EX_1710"),
        (DATE '2017-11-01', bea."EX_1711"),
        (DATE '2017-12-01', bea."EX_1712")
) v("Exp_Month", "Expense")
WHERE
    v."Expense" <> 0;

说明:

  1. 简化重复代码:原代码中重复的SELECT块被替换成LATERAL子句里的VALUES列表,每个月份只需要在列表中添加一行即可,无需重复编写整段SELECT逻辑,维护性大幅提升。
  2. 宽表转窄表:通过LATERAL JOIN将原表中每个EX_17xx列的行数据,转换成对应日期和费用的行记录,直接得到你需要的窄表结构。
  3. 性能优化:原代码多次扫描表,优化后的代码只扫描一次表,执行效率更高。

如果后续需要扩展更多月份,只需要在VALUES列表中追加对应的日期和列名即可,比如要加2018年1月,就添加(DATE '2018-01-01', bea."EX_1801")。

内容的提问来源于stack exchange,提问作者BlueHawk77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:45:21