Oracle报表SQL优化:合并客户行并实现买卖金额分列显示
解决Oracle报表同一客户买卖数据合并单行的问题
看了你的需求,问题核心在于原查询的GROUP BY子句包含了substr(o.tran_no,1,1)(交易类型前缀),这直接导致同一客户的BUY和SELL数据被拆分成两行展示。咱们只需要调整分组逻辑和聚合函数,就能实现同一客户的买卖数据在同一行并排显示,同时保证SELL对应负值、BUY对应正值。
关键改动点
- 移除分组中的交易类型前缀:从
GROUP BY中删除substr(o.tran_no,1,1),让同一客户的所有交易记录合并到同一行 - 调整COUNT统计逻辑:用
CASE WHEN替代原来依赖分组的DECODE,直接在聚合时统计BUY和SELL的交易笔数 - 保留金额正负逻辑:你提供的
SUM(CASE WHEN ...)逻辑已经完美满足SELL为负、BUY为正的要求,无需修改 - 额外优化:把原查询的逗号表连接改成显式
JOIN,提升代码可读性
修改后的完整SQL代码
SELECT COUNT(CASE WHEN substr(o.tran_no,1,1) = 'B' THEN 'BUY' END) AS Buy, COUNT(CASE WHEN substr(o.tran_no,1,1) = 'S' THEN 'SELL' END) AS sell, nvl('D.EXCH_CODE','01') AS CODE, sum(case when (o.tran_qty * o.price) < 0 then (o.tran_qty * o.price) else 0 end) as sell_t, sum(case when (o.tran_qty * o.price) > 0 then (o.tran_qty * o.price) else 0 end) as buy_t, o.client_no, c.client_name, sum(o.tran_qty*o.price) total, o.branch_code, r.descr, C.TDR_CODE FROM bos_m_ledger o JOIN bos_m_para r ON r.para_type='BRANCH' AND R.PARA_CODE = O.BRANCH_CODE JOIN bos_m_client c ON o.client_no=c.client_no JOIN bos_cltype g ON g.nbrk_rate=1 AND c.client_type=g.client_type JOIN BOS_M_STOCK D ON O.STOCK_NO =D.STOCK_NO AND D.CSTAMP_EXPIRY_DATE IS NOT NULL WHERE C.CLIENT_NO='3JF0391' AND o.tdr_code=c.tdr_code AND o.tran_type= 'CON' AND TO_DATE(TO_CHAR(O.TRAN_DATE,'MON'),'MON')=TO_DATE(:P_MONTH,'MON') AND TO_DATE(TO_CHAR(O.TRAN_DATE,'YYYY'),'YYYY') = TO_DATE(:P_YEAR,'YYYY') GROUP BY o.client_no,o.branch_code,r.descr,c.client_name, C.TDR_CODE ORDER BY O.BRANCH_CODE, C.TDR_CODE,O.CLIENT_NO
内容的提问来源于stack exchange,提问作者zakira
相关产品推荐
相关产品推荐

