1. 程式人生 > >天天拼SQL——被group後與原表再結合

天天拼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與聚合函式的結合。