您的位置:首页 > 数据库

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

2015-12-31 10:05 302 查看
[code]    最近在做的几个需求,总是天天在拼SQL。所以,今天的这篇博客也与这几天拼的sql有关啦。。。


背景

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




思考过程

[code]    看起来似乎有些乱。于是我先把关于总项目的信息查出来,如下:


[code]   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 '%%'


[code]    这样查出来的信息是不包括最终审批金额之和这一项的。
    于是,又把分组查询出的最终审批金额的表单独查出来如下:


[code]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


[code]效果如下:




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


[code]
      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


小结

[code]    在合并过程中,由于这里多次联合了t_cc_object这张表,所以,在多次使用objectname这个属性的时候,会出现各种不识别或其他错误,
    所以我们必须对它加一个别名。在这里,主要还是用到了join这个关键字和group by与聚合函数的结合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: