如何将PostgreSQL表按交易类型拆分并新增type列?
解决方案
你可以通过**LATERAL JOIN结合VALUES子句**实现行拆分与类型列生成,同时调整对应金额列的取值,完整SQL如下:
SELECT CASE t.type WHEN 'sale' THEN c."saleAmount" ELSE 0 END AS "saleAmount", CASE t.type WHEN 'buy' THEN c."buyAmount" ELSE COALESCE(c."buyAmount", NULL) END AS "buyAmount", o."id", t.type FROM "Charges" c LEFT JOIN "Operations" o ON o."id" = c."operationsId" LATERAL ( VALUES ('sale') WHERE c."saleAmount" > 0, ('buy') WHERE c."buyAmount" > 0 ) t(type) ORDER BY o."id", t.type;
语句说明:
行拆分逻辑:
LATERAL JOIN配合VALUES子句,针对每一行原数据生成对应类型的记录:- 当
saleAmount > 0时,生成type='sale'的行 - 当
buyAmount > 0时,生成type='buy'的行 - 若两者都大于0,则自动拆分为两行,满足需求
- 当
金额列调整:
- 标记为
sale的行,保留原saleAmount,buyAmount设为0(原buyAmount为NULL时则保留NULL) - 标记为
buy的行,保留原buyAmount,saleAmount设为0
- 标记为
排序:按
Operations.id和type排序,确保结果顺序与目标表一致
执行结果:
| saleAmount | buyAmount | id | type |
|---|---|---|---|
| 200 | NULL | id1 | sale |
| 300 | 0 | id2 | sale |
| 0 | 500 | id2 | buy |
| 0 | 100 | id3 | buy |
内容的提问来源于stack exchange,提问作者AmphaWolf
相关产品推荐
相关产品推荐

