数据库的基础数据的是时间区间,数据表格式如下:开始日期      结束日期       用户ID    工作内容
---------------------------------------------------
2010-12-1     2010-12-5       user1     客户现场支持
2010-12-1     2010-12-2       user2     出差
基础数据的是一个时间跨度,现在需要用SQL列出每一天每个人的工作任务类型,有知道怎么实现的吗?
得出的格式要求如下:日期          用户ID      工作内容
-----------------------------------
2010-12-1    user1      客户现场支持
2010-12-1    user2          出差
2010-12-2    user1      客户现场支持
2010-12-2    user2          出差
2010-12-3    user1      客户现场支持
2010-12-4    user1      客户现场支持
2010-12-5    user1      客户现场支持

解决方案 »

  1.   

    以下可以达到你的要求不?SELECT 开始日期
          ,结束日期
          ,用户ID
          ,工作内容
      FROM 基础数据
          ,(SELECT TO_DATE('2010/12/01', 'YYYY/MM/DD') + ROWNUM - 1 DAY_DATE FROM DUAL CONNECT BY ROWNUM < 32) DT
     WHERE 基础数据.开始日期 = DT.DAY_DATE
      

  2.   


    SQL> 
    SQL> with a as(
      2  select date '2010-12-1' startdate,date '2010-12-5' enddate, 'user1' username, '客户现场支持' doing from dual union all
      3  select date '2010-12-1' startdate,date '2010-12-2' enddate, 'user2' username, '出差' doing from dual
      4  )
      5  select *
      6    from (select distinct startdate + level - 1 t, username, doing
      7            from a
      8          connect by level <= enddate - startdate + 1)
      9   order by username, t
     10  /T           USERNAME DOING
    ----------- -------- ------------------
    2010-12-1   user1    客户现场支持
    2010-12-2   user1    客户现场支持
    2010-12-3   user1    客户现场支持
    2010-12-4   user1    客户现场支持
    2010-12-5   user1    客户现场支持
    2010-12-1   user2    出差
    2010-12-2   user2    出差7 rows selectedSQL> 
      

  3.   

    WITH tab AS(
    SELECT To_Date('2010-12-01','yyyy-mm-dd') begin_date, To_Date('2010-12-05','yyyy-mm-dd') end_date, 'user1' userid, '客户现场支持' concent FROM dual
    UNION ALL
    SELECT To_Date('2010-12-01','yyyy-mm-dd'),To_Date('2010-12-02','yyyy-mm-dd'), 'user2', '出差' FROM dual
    )
    SELECT DISTINCT  begin_date+LEVEL-1 AS 日期 ,userid 用户ID,concent 工作内容 
    FROM tab CONNECT BY LEVEL<=end_date-begin_date+1日期        用户ID 工作内容
    -----------------------------------------------
    2010.12.01  user1  客户现场支持
    2010.12.01  user2  出差        
    2010.12.02  user1  客户现场支持
    2010.12.02  user2  出差        
    2010.12.03  user1  客户现场支持
    2010.12.04  user1  客户现场支持
    2010.12.05  user1  客户现场支持
      

  4.   


    ----改下排序
    SQL> 
    SQL> with a as(
      2  select date '2010-12-1' startdate,date '2010-12-5' enddate, 'user1' username, '客户现场支持' doing from dual union all
      3  select date '2010-12-1' startdate,date '2010-12-2' enddate, 'user2' username, '出差' doing from dual
      4  )
      5  select *
      6    from (select distinct startdate + level - 1 t, username, doing
      7            from a
      8          connect by level <= enddate - startdate + 1)
      9   order by  t,username
     10  /T           USERNAME DOING
    ----------- -------- ------------------
    2010-12-1   user1    客户现场支持
    2010-12-1   user2    出差
    2010-12-2   user1    客户现场支持
    2010-12-2   user2    出差
    2010-12-3   user1    客户现场支持
    2010-12-4   user1    客户现场支持
    2010-12-5   user1    客户现场支持7 rows selectedSQL> 
      

  5.   

    SQL> 
    SQL> with tb as
      2  (select to_date('2010-12-01','yyyy-mm-dd') 开始日期, to_date('2010-12-5','yyyy-mm-dd') 结束日期,'user1' 用户ID ,'客户现场支持' 工作内容 from dual
      3  union all
      4  select to_date('2010-12-01','yyyy-mm-dd'),to_date('2010-12-02','yyyy-mm-dd'),'user2','出差' from dual
      5  )
      6  select 开始日期+level-1 dt,用户ID,工作内容 from tb a
      7  connect by level<=(select 结束日期-开始日期 from tb b where a.用户ID=b.用户ID)+1
      8  and connect_by_root(用户ID)=用户ID
      9  order by dt
     10  /
     
    DT          用户ID 工作内容
    ----------- ------ ------------
    2010-12-1   user1  客户现场支持
    2010-12-1   user2  出差
    2010-12-2   user1  客户现场支持
    2010-12-2   user2  出差
    2010-12-3   user1  客户现场支持
    2010-12-4   user1  客户现场支持
    2010-12-5   user1  客户现场支持
     
    7 rows selected