一张表(考勤信息表)
字段:用户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

解决方案 »

  1.   

    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,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
     
     
      

  2.   

    create or replace procedure prc_sxm1 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*************************/
      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是我模拟你的数据新建的表,你把改成你的表即可以了!
      

  3.   

    先前的有点问题,我重新修改了下,我测试是没有问题的:
    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;