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

FengShen_Xia 2008-12-26
format_me 写道
规则:按job_id和dep_id分组,同一组内如果有item为002的记录,这一组的no为002这条记录的name加当前时间,
     如果没有item为002的记录,在同一组内随便取一条记录的name值加上当前时间生成no。


哦,我开始是根据你给的规则来写的,你的规则里说到"同一组内如果有item为002的记录"

那么如果出现下面这组记录,那么no的结果按照那个item来展现阿?
job_id dep_id item name no
000404 0400 005 D005
000404 0400 006 E006

是不是只要有同组的记录,那么他们的no值是一样的,至于no前面的name有没有什么规定?是在这组记录中任取一个name就可以了?还是取这组中item最小/最大的那个name值?
FengShen_Xia 2008-12-26

我下面的这个sql语句是取同组记录中item最小的那个name值作为no的前缀:

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,min(item) item
                  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 = s.item) t2
 where tt.job_id = t2.job_id(+)
   and tt.dep_id = t2.dep_id(+)

 

其结果如下:

 

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

000404 0904   005  D005

D005 -2008-12-25 09:12:06

000404 0904 005 E006

D005 -2008-12-25 09:12:06

 

 

 

 

FengShen_Xia 2008-12-26
其中最后一条记录的item值应该是006
format_me 2008-12-29
对了  就是这样,是不是最小的item无所谓,只要在同一组中随便取一个name就行了(这一组中没有item为002的时候),感谢你这么热心的给我解答,谢谢。
FengShen_Xia 2008-12-29
呵呵,不客气
vtrtbb 2009-01-06
通常分组的话只要记住用 select case when sss.....else xxx end  from ... 基本就差不多
csdn里有个叫邹建的,那才叫sql高手,个个都精辟。。。。
icefishc 2009-01-21
更简单的版本 希望没有理解错需求。。。。。。。
没有测试
不过我查了一下 mysql应该支持对derived table做leftjoin的
select aa.job_id, 
       concat(coalesce(max(t1.name), max(aa.name))||'-',to_char(sysdate,'yyyy-mm-dd HH24:mm:ss')
  from aa 
       left join 
       (select job_id, name 
            from aa 
            where item = 002) t1
    on aa.job_id = t1.job_id
  group by aa.name
Global site tag (gtag.js) - Google Analytics