有这样一张表t,字段为 name,ny,danwei,意思大家应该能明白吧?
每月一条数据,我想实现这样一个结果:张三  200001——200210  一队
张三  200307——200506  二队
张三  200507——200703  一队
张三  200704——200802  三队
......其实就是类似个人工作简历,请问如何实现啊?当然,可以指定name='张三'

解决方案 »

  1.   

    select name,ny,danwei from t where name='张三' order by ny asc
      

  2.   


    select to_char(min(ny),'yyyymm')||'--'||to_char(max(ny),'yyyymm'),danwei from t
    where name='张三'
    group by danwei
      

  3.   

    select name,
           to_char(min(ny), 'yyyymm') || '--' || to_char(max(ny), 'yyyymm'),
           danwei
      from (select name, ny, to_char(ny, 'yyyymm') - rownum rn, danwei from t)
     where name = '张三'
     group by rn, name, danwei
     order by 2;
      

  4.   

    如果表中所用数据并非按顺序进行排列的话,请使用一下代码:select name,
           to_char(min(ny), 'yyyymm') || '--' || to_char(max(ny), 'yyyymm'),
           danwei
      from (select name, ny, to_char(ny, 'yyyymm') - rownum rn, danwei from t order by name,danwei,ny)
     where name = '张三'
     group by rn, name, danwei
     order by 2;
      

  5.   


    WITH t AS
    (
      SELECT '张三' name, to_date('200001','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
      SELECT '张三' name, to_date('200201','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
      SELECT '张三' name, to_date('200202','YYYYMM') ny,'二队' danwei FROM dual UNION ALL
      SELECT '张三' name, to_date('200301','YYYYMM') ny,'二队' danwei FROM dual UNION ALL
      SELECT '张三' name, to_date('200302','YYYYMM') ny,'三队' danwei FROM dual UNION ALL
      SELECT '李四' name, to_date('200001','YYYYMM') ny,'一队' danwei FROM dual
         )
    select a.name,
           to_char(a.ny,'YYYYMM') || '--' || to_char(b.ny,'YYYYMM') ny,
           a.danwei
      from 
           (select name, min(ny) ny, danwei from t GROUP BY NAME,danwei) a
          LEFT JOIN 
               (select name, MAX(ny) ny, danwei from t GROUP BY NAME,danwei) b 
                ON a.name = b.name AND a.danwei = b.danwei
     group by a.name ,to_char(a.ny,'YYYYMM') || '--' || to_char(b.ny,'YYYYMM') ,a.danwei
     order by 1,2,3;
      

  6.   

    害虫大牛!
    这段代码满足了一半我的需求。
    减rownum的想法很妙!有效的实现了统计时间段。但是缺点是ny(年月,6位字符)跨年的时候不是简单的+1,因此这样得到的结果中若是ny跨年,就会是多行,例如,本来是 “张三  200507-200703  一队”,结果却是:
    张三  200507-200512  一队
    张三  200601-200612  一队
    张三  200701-200703  一队
    大牛们,能否再想想办法啊?
      

  7.   

    哇哈哈哈哈哈哈!被我想到了!
    还是害虫的思路,不过不是减rownum,而是用add_months函数减rownum个月,这样跨年就不存在问题了!
      

  8.   

    就是应该套入oralce的时间函数,然后可以顺利解决时间进制的问题,恭喜你又进步了。