数据库的基础数据的是时间区间,数据表格式如下:开始日期 结束日期 用户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 客户现场支持
---------------------------------------------------
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 客户现场支持
解决方案 »
- 菜鸟请教,在PLSQL中创建表,提示“缺少右括号”
- 字段模糊性相似查询
- oracle取时间问题
- Oracle有没联机丛书
- 关于oracle的内嵌视图,在哪可以找到详细说明?
- 求助:Proc程序频繁连接Oracle 数据库会对Oracle产生什么影响?对操作系统产生什么影响?
- fetch cur_a into cr; 我怎么把这个循环返回呢,怎么写输出呢,刚刚学,大家不要笑我
- ? ORA-12541:TNS:没有监听器?如何解决?
- 在Por*c里面EXEC SQL ……后怎么样取到SQL语句?
- 用java去建立oracle的表空间,行不行?
- 急求一语句
- Oracle,不使用子查询,SQL语句怎么写能返回按某个字段排序后的第一行?
,结束日期
,用户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
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>
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 客户现场支持
----改下排序
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>
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