如何简化重复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;
说明:
- 简化重复代码:原代码中重复的SELECT块被替换成
LATERAL子句里的VALUES列表,每个月份只需要在列表中添加一行即可,无需重复编写整段SELECT逻辑,维护性大幅提升。 - 宽表转窄表:通过
LATERAL JOIN将原表中每个EX_17xx列的行数据,转换成对应日期和费用的行记录,直接得到你需要的窄表结构。 - 性能优化:原代码多次扫描表,优化后的代码只扫描一次表,执行效率更高。
如果后续需要扩展更多月份,只需要在VALUES列表中追加对应的日期和列名即可,比如要加2018年1月,就添加(DATE '2018-01-01', bea."EX_1801")。
内容的提问来源于stack exchange,提问作者BlueHawk77
相关产品推荐
相关产品推荐

