日期:2014-05-16  浏览次数:20507 次

一个数据库分组统计的问题

数据库中有一张表Test,其表结构如下所示:??

job_id dep_id item name no
000101 0900 002 A001 ?
000101 0900 003 A002 ?
000101 0901 001 B003 ?
000202 0900 004 A005 ?
000202 0902 003 C004 ?
000303 0901 002 B004 ?
000303 0901 004 B005 ?

?

规则:其实意思就是让一组中item为002的记录所对应的name优先做no的前缀
1、先以job_id,dep_id分组记录;
2、检查同一组记录中有沒有item为002的记录,如果存在,這一组记录的no都是以item为002这条记录对应的name+当前日期,这一组记录的no都相同;如果一组中不存在item为002的记录那么可以隨便挑一个同组中name字段的值做no的前缀。

?

其结果如下所示:?

job_id dep_id item name no
000101 0900 002 A001 A001 -2008-12-25 09:12:06
000101 0900 003 A002 A001 -2008-12-25 09:12:06
000101 0901 001 B003 B003-2008-12-25 09:12:06
000202 0900 004 A005 A005-2008-12-25 09:12:06
000202 0902 003 C004 C004-2008-12-25 09:12:06
000303 0901 002 B004 B004 -2008-12-25 09:12:06
000303 0901 004 B005 B004 -2008-12-25 09:12:06

?

?

其Sql语句为:

?

select tt.job_id,tt.dep_id,tt.item,tt.name,
     nvl2(t2.no,t2.no,concat(tt.name || '-', to_char(sysdate,'yyyy-mm-dd HH24:mm:ss'))) no
  from test tt,
       (select t1.job_id,t1.dep_id,t1.item,t1.name,
               concat(t1.name || '-',to_char(sysdate, 'yyyy-mm-dd HH24:mm:ss')) no
          from test t1,
               (select job_id sj, dep_id sd
                  from test t
                 group by job_id, dep_id
                having count(*) > 1) s
         where t1.job_id = s.sj
           and t1.dep_id = s.sd
           and t1.item = '002') t2
 where tt.job_id = t2.job_id(+)
   and tt.dep_id = t2.dep_id(+)

?