Database 如何在PL/SQL中进行汇总

Database 如何在PL/SQL中进行汇总,database,oracle,plsql,aggregate,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

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

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
现在我想这样总结一下:

userID     result1    result2
1             2         1
2             2         0
3             2         2
(total)       6         3
对我来说,汇总用户数据很好,但如何在查询中添加总计行?工会对此不起作用

非常感谢你这么做

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

  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;

我假设您正在使用GROUP BY生成当前结果。(注:请发布您当前的查询,因为很难猜测您是如何获得该结果的)

要获得所需内容,请使用分组汇总而不是分组汇总

工会对此不起作用


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

我假设您正在使用GROUP BY生成当前结果。(注:请发布您当前的查询,因为很难猜测您是如何获得该结果的)

要获得所需内容,请使用分组汇总而不是分组汇总

工会对此不起作用


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

有一种更快的方法

假设在“结果”字段上只能得到1或2的值,这将起作用:

SELECT  userid
,       SUM(DECODE (result, 1, 1, 0)) as result1
,       SUM(DECODE (result, 2, 1, 0)) as result2
FROM    x
GROUP BY userid;
这将产生预期的输出:

USERID    RESULT1   RESULT2                
--------- --------- ---------
1         2         1
2         2         0 
3         2         2 

如果字段结果上的可能值大于1或2,则可以添加更多的求和解码行,或者执行前面提到的PL/SQL过程。

有一种更快的方法

假设在“结果”字段上只能得到1或2的值,这将起作用:

SELECT  userid
,       SUM(DECODE (result, 1, 1, 0)) as result1
,       SUM(DECODE (result, 2, 1, 0)) as result2
FROM    x
GROUP BY userid;
这将产生预期的输出:

USERID    RESULT1   RESULT2                
--------- --------- ---------
1         2         1
2         2         0 
3         2         2 

如果字段结果上的可能值大于1或2,则可以添加更多的总和解码行,或执行上述PL/SQL过程。

谢谢。我添加了查询:)@Vimvq1987:Change
groupbyuserid
groupbyrollup(USERID)
。谢谢。我添加了查询:)@Vimvq1987:Change
groupbyuserid
groupbyrollup(USERID)
。您使用
完全外部联接有什么原因吗?这可能做的工作比必要的多,因为看起来您实际上需要一个
右外部联接
,除非我弄错了。它将返回大量完全为空的行,因为您使用的是c.USERID而不是我想要的u.idid。当显示在gridcontrol中时,null值将转换为0,如果我不使用右外部联接,没有调用的用户将被忽略。您使用
完全外部联接的原因是什么?这可能做的工作比必要的多,因为看起来您实际上需要一个
右外部联接
,除非我弄错了。它将返回大量完全为空的行,因为您使用的是c.USERID而不是我想要的u.idid。当显示在gridcontrol中时,null值将转换为0,如果我不使用正确的外部联接,将忽略没有调用的用户。艰难的解码更紧凑,用例更灵活,也更标准的SQL。尽管解码更紧凑,用例更灵活,也更标准的SQL。