行合并重排

O___O 2014-06-16 10:41:10
表1(1个结算编号一条数据)
结算编号,应收金额
1000001, 250.00

表2(1个结算编号N条数据)
结算编号,付款方式,付款金额
10000001, 现金, 50.00
10000001, 银联, 200.00

表3(1个结算编号N条数据)
结算编号,消费项目,消费金额
10000001, 足浴, 100.00
10000001, 按摩, 100.00
10000001, 桑拿, 50.00

客户需要的报表
结算编号,应收金额,付款方式,付款金额,消费项目,消费金额
1000001, 250.00, 现金, 50.00, 足浴, 100.00
1000001, 0.00 银联, 200.00, 按摩, 100.00
1000001, 0.00 null , 0.00, 桑拿, 50.00
...全文
212 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chuck_Perry 2014-06-17
  • 打赏
  • 举报
回复
我觉得这样好一些: select t3.结算编号, t1.应收金额, t2.付款方式, t2.付款金额, t3.消费项目, t3.消费金额 from (select rownum id, t1.* from yoyo.tb1 t1 where t1.结算编号 = 10000001) t1 right join (select rownum id, t2.* from yoyo.tb2 t2 where t2.结算编号 = 10000001) t2 on t1.id = t2.id right join (select rownum id, t3.* from yoyo.tb3 t3 where t3.结算编号 = 10000001) t3 on t2.id = t3.id
qq804927505 2014-06-17
  • 打赏
  • 举报
回复
这种要求的报表,写出来的sql就比较死了,适用性和延展性都不够:
select 表1.结算编号,
       (case
         when 表2.付款方式 = '现金' and 表3.消费项目 = '足浴' then
          表1.应收金额
         else
          0
       end) 应收金额,
       (case
         when 表3.消费项目 = '足浴' then
          表2.付款方式
         when 表3.消费项目 = '按摩' then
          表2.付款方式
         else
          null
       end) 付款方式,
       (case
         when 表2.付款方式 = '现金' then
          表2.付款金额
         when 表2.付款方式 = '银联' and 表3.消费项目 = '按摩' then
          表2.付款金额
         else
          0
       end) 付款金额,
       表3.消费项目,
       表3.消费金额
  from 表3
  left join 表1
    on 表3.结算编号 = 表1.结算编号
  left join 表2
    on 表2.结算编号 = 表1.结算编号
一生一事 2014-06-17
  • 打赏
  • 举报
回复

with a as
(
select '1000001' as id,250.00 as sumAm from dual
)
, b as
(
select '1000001' as id,'现金' as payty,50.00 as paym from dual
union all
select '1000001','银联',200.00 from dual
)
, c as
(
select '1000001' as id,'足浴' as conpro,100.00 as conm from dual
union all
select '1000001','按摩',100.00 from dual
union all
select '1000001','桑拿',50.00 from dual
)
select t1.id,nvl(t3.sumAm,0.00),t2.payty,nvl(t2.paym,0.00),t1.conpro,t1.conm from (select c.*,rownum as tr from c) t1
left join (select b.*,rownum as tr from b) t2 on t2.id=t1.id and t2.tr=t1.tr
left join (select a.*,rownum as tr from a) t3 on t3.id=t1.id and t3.tr=t1.tr
c_sdn_shang_bu_qi 2014-06-17
  • 打赏
  • 举报
回复
2跟3内连接,汇总成一个表 然后1跟上面表左连接 金额里的0.0用case when

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧