一个数据库分组统计的问题
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
是不是这样的结果阿?
sql语句如下(oracle):
select t1.job_id,t1.dep_id,t1.item,t1.name, |
|||||||||||||||||||||||||||||||||||||||||
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
呵呵,不好意思阿,开始没搞明白你要的结果
select tt.job_id,tt.dep_id,tt.item,tt.name,
其结果如下:
|
|||||||||||||||||||||||||||||||||||||||||
format_me
2008-12-25
兄台,你幫了我大忙阿,這樣我就不需要把數據在三個表裏來回的倒了。謝謝!
順便說一聲,你的頭像很性感。 |
|||||||||||||||||||||||||||||||||||||||||
FengShen_Xia
2008-12-25
format_me 写道 兄台,你幫了我大忙阿,這樣我就不需要把數據在三個表裏來回的倒了。謝謝!
順便說一聲,你的頭像很性感。 头像的口号是:有沟就能红 哈哈~~~ |
|||||||||||||||||||||||||||||||||||||||||
format_me
2008-12-25
赫赫,握手。
|
|||||||||||||||||||||||||||||||||||||||||
format_me
2008-12-26
FengShen_Xia 写道 呵呵,不好意思阿,开始没搞明白你要的结果
select tt.job_id,tt.dep_id,tt.item,tt.name,
其结果如下:
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 |