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

format_me 2008-12-22
aa
|----------|----------|----------|----------|----------|
|  job_id  |    no    |  dep_id  |   item   |   name   |
|----------|----------|----------|----------|----------|
|  000101  |          |   0900   |    002   |   A001
|----------|----------|----------|----------|----------|
|  000101  |          |   0900   |    003   |   A002
|----------|----------|----------|----------|----------|
|  000101  |          |   0901   |    001   |   B003
|----------|----------|----------|----------|----------|
|  000202  |          |   0902   |    003   |   C004
|----------|----------|----------|----------|----------|
|  000202  |          |   0900   |    004   |   A005
|----------|----------|----------|----------|----------|
|  000303  |          |   0901   |    002   |   B004
|----------|----------|----------|----------|----------|
|  000303  |          |   0901   |    004   |   B005

目的:为aa表生成一个编号(no)。
规则:按job_id和dep_id分组,同一组内如果有item为002的记录,这一组的no为002这条记录的name加当前时间,
     如果没有item为002的记录,在同一组内随便取一条记录的name值加上当前时间生成no。

提问:有没有办法用一条sql语句完成,数据库是MySQL。

format_me 2008-12-22
aa
|----------|----------|----------|----------|----------|
|  job_id  |    no    |  dep_id  |   item   |   name   |
|----------|----------|----------|----------|----------|
|  000101  |          |   0900   |    002   |   A001  
|----------|----------|----------|----------|----------|
|  000101  |          |   0900   |    003   |   A002  
|----------|----------|----------|----------|----------|
|  000101  |          |   0901   |    001   |   B003
|----------|----------|----------|----------|----------|
|  000202  |          |   0902   |    003   |   C004  
|----------|----------|----------|----------|----------|
|  000202  |          |   0900   |    004   |   A005  
|----------|----------|----------|----------|----------|
|  000303  |          |   0901   |    002   |   B004  
|----------|----------|----------|----------|----------|
|  000303  |          |   0901   |    004   |   B005   
FengShen_Xia 2008-12-23
job_id dep_id item name no
000101
0900 002 A001 A001 -2008-12-23 08:12:28
000101 0900 003 A002 $000-2008-12-23 08:12:28
000101 0901 001 B003 $000-2008-12-23 08:12:28
000202 0900 004 A005 $000-2008-12-23 08:12:28
000202 0902 003 C004 $000-2008-12-23 08:12:28
000303 0901 002 B004 B004 -2008-12-23 08:12:28
000303 0901 004 B005 $000-2008-12-23 08:12:28

 

是不是这样的结果阿?

 

 

sql语句如下(oracle):

 

select t1.job_id,t1.dep_id,t1.item,t1.name,
       case item
         when '002' then concat(t1.name||'-',to_char(sysdate,'yyyy-mm-dd HH24:mm:ss'))
         else concat('$000'||'-',to_char(sysdate,'yyyy-mm-dd HH24:mm:ss'))
       end no
 from aa t1, (select job_id sj, dep_id sd from aa t group by job_id, dep_id) s
 where t1.job_id = s.sj
     and t1.dep_id = s.sd

format_me 2008-12-24
感謝FengShen_Xia回帖,sql我也是寫道這不知道怎麽往下寫了,現在的結果和我想要的還有一點出入,我想要的結果是:

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

數據太少,不知道有沒有表現清楚
統計規則:其實意思就是讓一組中item為002的紀錄所對應的name優先做no的前綴
1、先以job_id,dep_id分組記錄;
2、檢察同一組紀錄中有沒有item為002的紀錄,如果存在,這一組記錄的no都是以item為002這條記錄對應的name+當前日期,这一組記錄的no都相同;如果一組中不存在item為002的紀錄那麽可以隨便挑一個同組中name字段的值做no的前綴。
就是這樣。
再次感謝!
FengShen_Xia 2008-12-25

呵呵,不好意思阿,开始没搞明白你要的结果


按照你上面的结果,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 aa 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 aa t1,
               (select job_id sj, dep_id sd
                  from aa 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(+)

 

 

其结果如下:

 

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

 

format_me 2008-12-25
兄台,你幫了我大忙阿,這樣我就不需要把數據在三個表裏來回的倒了。謝謝!
順便說一聲,你的頭像很性感。
FengShen_Xia 2008-12-25
format_me 写道
兄台,你幫了我大忙阿,這樣我就不需要把數據在三個表裏來回的倒了。謝謝!
順便說一聲,你的頭像很性感。


头像的口号是:有沟就能红
哈哈~~~
format_me 2008-12-25
赫赫,握手。
format_me 2008-12-26
FengShen_Xia 写道

呵呵,不好意思阿,开始没搞明白你要的结果


按照你上面的结果,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 aa 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 aa t1,
               (select job_id sj, dep_id sd
                  from aa 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(+)

 

 

其结果如下:

 

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

 


XIA 這樣寫還是有點問題,有‘002’在的組可以滿足要求,但沒002的組不會擁有同一個編號,我想應該是這樣(MySQL) select a.job_id,a.dep_id,a.item,a.name,ifnull(ad,dzno) from (select aa.job_id ji,aa.dep_id di,concat(aa.name,date_format(now(),'%y%m')) dzno from aa group by aa.job_id,aa.dep_id having count(*)>0) ab,aa a left join (select a1.job_id,a1.dep_id,a1.item,a1.name,a3.dz ad from aa a1, (select a2.job_id aj,a2.dep_id ad,concat(name,date_format(now(),'%y%m')) dz from aa a2 group by a2.job_id,a2.dep_id having count(*)>0) a3 where a3.aj=a1.job_id and a3.ad=a1.dep_id and a1.item='002') a4 on a.job_id=a4.job_id and a.dep_id = a4.dep_id where ab.ji=a.job_id and ab.di=a.dep_id 但是即使是這樣還是有問題,如果一組中有002的帳戶在這組第一個出現,这個sql沒有問題,如果不是第一個出現,那就有問題了,他不會優先取002所對應的name做這一組的編號
format_me 2008-12-26
select a.job_id,a.dep_id,a.item,a.name,ifnull(ad,dzno) from 
(select aa.job_id ji,aa.dep_id di,concat(aa.name,date_format(now(),'%y%m')) dzno
	 from aa group by aa.job_id,aa.dep_id having count(*)>1) ab,aa a left join 
  (select a1.job_id,a1.dep_id,a1.item,a1.name,a3.dz ad
    from aa a1,
      (select a2.job_id aj,a2.dep_id ad,concat(name,date_format(now(),'%y%m')) dz
	from aa a2 
	group by a2.job_id,a2.dep_id 
	having count(*)>1) a3 
	where a3.aj=a1.job_id and a3.ad=a1.dep_id and a1.item='002') a4 on 

a.job_id=a4.job_id and a.dep_id = a4.dep_id
where ab.ji=a.job_id and ab.di=a.dep_id
Global site tag (gtag.js) - Google Analytics