一个数据库分组统计的问题
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(+)
其结果如下:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
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 |