一张表(考勤信息表)
字段:用户id,日期,时间
sql语句功能要求:
显示报表格式为:用户id---日期--该日期中的第一个时间(从字段时间中取)--该日期中的第二个时间(从字段时间中取)--该日期中的第三个时间(从字段时间中取)表中的 具体内容为
用户id-- 日期-- 时间--
1123 2008-9-19 9:7:47
1123 2008-9-19 19:7:47
1123 2008-9-19 13:7:47
1123 2008-9-19 12:7:47
输出格式为 1123 2008-9-19 9:7:47 19:7:47 13:7:47 12:7:47
字段:用户id,日期,时间
sql语句功能要求:
显示报表格式为:用户id---日期--该日期中的第一个时间(从字段时间中取)--该日期中的第二个时间(从字段时间中取)--该日期中的第三个时间(从字段时间中取)表中的 具体内容为
用户id-- 日期-- 时间--
1123 2008-9-19 9:7:47
1123 2008-9-19 19:7:47
1123 2008-9-19 13:7:47
1123 2008-9-19 12:7:47
输出格式为 1123 2008-9-19 9:7:47 19:7:47 13:7:47 12:7:47
2 UNION
3 SELECT 1123 ID,'2008-9-19' DAY,'19:7:47' TIME FROM DUAL
4 UNION
5 SELECT 1123 ID,'2008-9-19' DAY,'13:7:47' TIME FROM DUAL
6 UNION
7 SELECT 1123 ID,'2008-9-19' DAY,'12:7:47' TIME FROM DUAL
8 )
9 select ID,DAY,WMSYS.WM_CONCAT(TIME) TIME FROM A
10 GROUP BY ID,DAY
11 /
ID DAY TIME
---------- --------- ------------------------------------------------------------
1123 2008-9-19 12:7:47,13:7:47,19:7:47,9:7:47
10G及以上的版本可以這樣寫第二中方法
SQL> WITH A AS (SELECT 1123 ID,'2008-9-19' DAY,'9:7:47' TIME FROM DUAL
2 UNION
3 SELECT 1123 ID,'2008-9-19' DAY,'19:7:47' TIME FROM DUAL
4 UNION
5 SELECT 1123 ID,'2008-9-19' DAY,'13:7:47' TIME FROM DUAL
6 UNION
7 SELECT 1123 ID,'2008-9-19' DAY,'12:7:47' TIME FROM DUAL
8 )
9 select ID,DAY,MAX(SYS_CONNECT_BY_PATH(TIME,',')) TIME FROM
10 (SELECT ID,DAY,TIME,ROW_NUMBER()OVER(PARTITION BY ID,DAY ORDER BY ID ) RN FROM A)
11 START WITH RN=1
12 CONNECT BY RN-1=PRIOR RN
13 GROUP BY ID,DAY
14 /
ID DAY TIME
---------- --------- ----------------------------------------------------------------------------
1123 2008-9-19 ,12:7:47,9:7:47,19:7:47,13:7:47
/************************
一张表(考勤信息表)
字段:用户id,日期,时间
sql语句功能要求:
显示报表格式为:用户id---日期--该日期中的第一个时间(从字段时间中取)--该日期中的第二个时间(从字段时间中取)--该日期中的第三个时间(从字段时间中取) 表中的 具体内容为
用户id-- 日期-- 时间--
1123 2008-9-19 9:7:47
1123 2008-9-19 19:7:47
1123 2008-9-19 13:7:47
1123 2008-9-19 12:7:47
输出格式为
1123 2008-9-19 9:7:47 19:7:47 13:7:47 12:7:47*************************/
cursor cur_getid is
select distinct id,rq1 from tt;
cursor cur_getrq is
select id,rq1,rq2 from tt;
v_sql varchar2(200);
--v_sql:='';
cur_id cur_getid%rowtype;
cur_rq cur_getrq%rowtype;
BEGIN
open cur_getid;
open cur_getrq;
loop
fetch cur_getid into cur_id;
exit when cur_getid%notfound;
v_sql:=cur_id.id||' '||cur_id.rq1;--把用户id与日期放在一起
fetch cur_getrq into cur_rq;
--循环取得时间
if (cur_rq.id=cur_id.id and cur_rq.rq1=cur_id.rq1 )
then
begin
v_sql:=v_sql||' '||cur_rq.rq2;
fetch cur_getrq into cur_rq;
end;
end if;
DBMS_OUTPUT.put_line(v_sql);
end loop;
END prc_sxm1;
我测试下可不可以 ,其中TT是我模拟你的数据新建的表,你把改成你的表即可以了!
create or replace procedure prc_sxm1(err out varchar2) is
/************************
Ò»ÕÅ±í£¨¿¼ÇÚÐÅÏ¢±í£©
×ֶΣºÓû§id,ÈÕÆÚ£¬Ê±¼ä
sqlÓï¾ä¹¦ÄÜÒªÇó£º
ÏÔʾ±¨±í¸ñʽΪ£ºÓû§id---ÈÕÆÚ--¸ÃÈÕÆÚÖеĵÚÒ»¸öʱ¼ä£¨´Ó×Ö¶Îʱ¼äÖÐÈ¡£©--¸ÃÈÕÆÚÖеĵڶþ¸öʱ¼ä£¨´Ó×Ö¶Îʱ¼äÖÐÈ¡£©--¸ÃÈÕÆÚÖеĵÚÈý¸öʱ¼ä£¨´Ó×Ö¶Îʱ¼äÖÐÈ¡£© ±íÖÐµÄ ¾ßÌåÄÚÈÝΪ
Óû§id-- ÈÕÆÚ-- ʱ¼ä--
1123 2008-9-19 9:7:47
1123 2008-9-19 19:7:47
1123 2008-9-19 13:7:47
1123 2008-9-19 12:7:47
Êä³ö¸ñʽΪ
1123 2008-9-19 9:7:47 19:7:47 13:7:47 12:7:47 declare
err varchar2(100);
begin
pro_sxm1(err);
dbms_output.put_line('error is'||err);
end;
1123 2008-9-19 9:7:47
*************************/
cursor cur_getid is
select distinct id,rq1 from tt;
cursor cur_getrq is
select id,rq1,rq2 from tt;
v_sql varchar2(200);
v_err varchar2(200);
l integer;
i integer;
--v_sql:='';
cur_id cur_getid%rowtype;
cur_rq cur_getrq%rowtype;
BEGIN
open cur_getid;
open cur_getrq;
loop
fetch cur_getid into cur_id;
exit when cur_getid%notfound;
v_sql:=cur_id.id||' '||cur_id.rq1;--°ÑÓû§idÓëÈÕÆÚ·ÅÔÚÒ»Æð
fetch cur_getrq into cur_rq;
--Ñ»·È¡µÃʱ¼ä
if (cur_rq.id=cur_id.id and cur_rq.rq1=cur_id.rq1 )
then
select count(*) into l from tt where tt.id=cur_id.id ;
for i in 1..l
loop
v_sql:=v_sql||' '||cur_rq.rq2;
fetch cur_getrq into cur_rq;
end loop;
end if;
DBMS_OUTPUT.put_line(v_sql);
end loop;
exception when others
then v_err :=sqlerrm;
err:=v_err;
--DBMS_OUTPUT.put_line(v_err);
END prc_sxm1;