天天拼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与聚合函数的结合。
相关文章推荐
- windows 下memcached服务的启动与停止
- MySQL~ IN , FIND_IN_SET , LIKE
- SQL查询
- lepus 监控oracle11g
- 提取表的sql原句
- MySQL Proxy的安装及基本命令使用教程
- Win2008R2 zip格式mysql 安装
- Oracle 多行记录合并/连接/聚合字符串的几种方法
- mysql自定义函数field
- 关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
- Cas(06)——基于数据库的认证
- MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]
- 美图秀秀DBA谈MySQL运维及优化
- 数据库数据横排显示2
- 关于MySQL密码你应该知道的那些事
- 数据库数据横排显示
- JSP使用JDBC连接MYSQL数据库的方法
- sql中去除重复的项
- DBA常用SQL之数据库基础信息
- [转]Oracle中使用Rownum分页详细例子