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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:12:28