如何在PL/SQL中进行总结

Vim*_*987 0 database oracle plsql aggregate

鉴于我有一个包含用户数据的表,如下所示:

userID     calltime     result 
1         10:20         1
1         11:00         2
1         11:30         1
2         9:30          1
2         11:00         1
3         10:00         1
3         10:30         2
3         11:00         1
3         11:30         2
Run Code Online (Sandbox Code Playgroud)

现在我想这样总结一下:

userID     result1    result2
1             2         1
2             2         0
3             2         2
(total)       6         3
Run Code Online (Sandbox Code Playgroud)

对我来说,总结用户数据很好,但是如何在查询中添加总行?UNION不适用于此.

非常感谢你做的这些.

编辑:这是我当前的查询,当然,它不起作用:

  PROCEDURE P_SUMMARIZE_CALL
  (
    pStartDate IN DATE,
    pEndDate IN DATE,
    SummaryCur  OUT MEGAGREEN_CUR    
  )
  IS
  BEGIN
    OPEN SUMMARYCUR FOR
    SELECT USERID, TOTALCALLS,CONNECTEDCALLS,RATE,NOANSWER FROM
    (((SELECT USERID,
            count(CALLID) AS TOTALCALLS, 
            sum(CONNECTED) as CONNECTEDCALLS, 
            sum(CONNECTED)/count(CALLID)*100 || '%' AS RATE,
            (count(CALLID) - sum(CONNECTED)) AS NOANSWER 
    FROM CALLLOGS
    WHERE STARTTIME BETWEEN pStartDate AND pEndDate  
   group by USERID) c
   FULL OUTER JOIN USERS u
   ON c.USERID = u.ID)

    UNION ALL 
     (SELECT NULL,count(CALLID) AS TOTALCALLS, 
            sum(CONNECTED) as CONNECTEDCALLS, 
            sum(CONNECTED)/count(CALLID)*100 || '%' AS RATE,
            (count(CALLID) - sum(CONNECTED)) AS NOANSWER 
    FROM CALLLOGS
    WHERE STARTTIME BETWEEN pStartDate AND pEndDate group by NULL));   

  END;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

我假设您正在使用GROUP BY生成当前结果.(PS:请发布您当前的查询,因为很难猜测您正在做什么来获得该结果).

要获得所需内容,请使用GROUP BY ROLLUP而不是GROUP BY.

UNION不适用于此.

是的,实际上这也会奏效.但我建议UNION ALL而不是UNION,因为你的结果集似乎已经只包含不同的行,所以没有必要使用额外的计算时间来搜索要删除的重复行.