天天拼SQL——被group后与原表再结合

    最近在做的几个需求,总是天天在拼SQL。所以,今天的这篇博客也与这几天拼的sql有关啦。。。

背景

    需求是这样的。要从数据库中查一组数据。这组数据中包括各个分项目的详细信息和审批金额,而每一组分项目又属于不同的申请表单
    (相当于各自有不同的父项目),还需要将各个分项目的审批金额的总和都加在每一个分项目的一列中。
    最后的效果:

这里写图片描述

思考过程

    看起来似乎有些乱。于是我先把关于总项目的信息查出来,如下:
   select md.billmaindataid mid, nvl(r.objectname,' ') 分部名称,nvl(m.objectname,' ') 门店名称 ,nvl(xn.objectname,' ') 项目名称,
              decode(c.name,'新开门店预算申请表单','新开','重装门店预算申请表单','重装','办公区装修预算申请表单','办公区','超级店'),md.item50,
              nvl(md.item51,' '),nvl(md.item116,0),
              md.occurtime, c.no  ,nvl(g.objectname,' ') 工程项目,nvl(x.objectname,' ') 项目细项,
              nvl(bd.offoriginalcurrency,0),nvl(bd.originalcurrency,0),
              s.objectname,z.objectname 是否在入名录,decode(c.status,1,'审批中',2,'审批结束',3,'已终止')
       from cc_form c
       inner join t_Cc_Billmaindata md on c.no=md.billnumber 
       left join t_cc_billdetaildata bd on md.billmaindataid=bd.billmaindataid 
       left join  t_cc_object r on r.objectid=md.requisitionusercompany
       left join t_cc_object m on m.objectid=md.item52
       left join t_Cc_Object g on g.objectid=bd.dimaccount
       left join t_cc_object x on x.objectid=bd.dim06
       left join t_cc_object xn on xn.objectid=md.item12
       left join t_cc_object z on z.objectid=bd.item14
       left join t_cc_object s on s.objectid=bd.item13
      where c.name like '%预算申请表单%' and c.status!=0 and c.status!=-1 and c.name like '%%'
    这样查出来的信息是不包括最终审批金额之和这一项的。
    于是,又把分组查询出的最终审批金额的表单独查出来如下:
select md2.billmaindataid bmid, sum(bd2.originalcurrency) money 
          from cc_form c2
          inner join t_Cc_Billmaindata md2 on c2.no=md2.billnumber 
          left join t_cc_billdetaildata bd2 on md2.billmaindataid=bd2.billmaindataid     
          where c2.name like '%预算申请表单%' group by md2.billmaindataid   
效果如下:

这里写图片描述

最后要将这两张表进行合并就可以了,代码如下:

      select * from
       (  
              select md.billmaindataid mid, nvl(r.objectname,' ') 分部名称,nvl(m.objectname,' ') 门店名称 ,nvl(xn.objectname,' ') 项目名称,
              decode(c.name,'新开门店预算申请表单','新开','重装门店预算申请表单','重装','办公区装修预算申请表单','办公区','超级店'),md.item50,
              nvl(md.item51,' '),nvl(md.item116,0),
              md.occurtime, c.no  ,nvl(g.objectname,' ') 工程项目,nvl(x.objectname,' ') 项目细项,
              nvl(bd.offoriginalcurrency,0),nvl(bd.originalcurrency,0),
              s.objectname,z.objectname 是否在入名录,decode(c.status,1,'审批中',2,'审批结束',3,'已终止')
       from cc_form c
       inner join t_Cc_Billmaindata md on c.no=md.billnumber 
       left join t_cc_billdetaildata bd on md.billmaindataid=bd.billmaindataid 
       left join  t_cc_object r on r.objectid=md.requisitionusercompany
       left join t_cc_object m on m.objectid=md.item52
       left join t_Cc_Object g on g.objectid=bd.dimaccount
       left join t_cc_object x on x.objectid=bd.dim06
       left join t_cc_object xn on xn.objectid=md.item12
       left join t_cc_object z on z.objectid=bd.item14
       left join t_cc_object s on s.objectid=bd.item13
      where c.name like '%预算申请表单%' and c.status!=0 and c.status!=-1 and c.name like '%%'
      ) inner join 
      (
          select md2.billmaindataid bmid, sum(bd2.originalcurrency) money 
          from cc_form c2
          inner join t_Cc_Billmaindata md2 on c2.no=md2.billnumber 
          left join t_cc_billdetaildata bd2 on md2.billmaindataid=bd2.billmaindataid     
          where c2.name like '%预算申请表单%' group by md2.billmaindataid   
      ) on mid=bmid 

小结

    在合并过程中,由于这里多次联合了t_cc_object这张表,所以,在多次使用objectname这个属性的时候,会出现各种不识别或其他错误,
    所以我们必须对它加一个别名。在这里,主要还是用到了join这个关键字和group by与聚合函数的结合。    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值