代码之家  ›  专栏  ›  技术社区  ›  Delta76

如何在PL/SQL中进行总结

  •  0
  • Delta76  · 技术社区  · 13 年前

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

    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;
    
    2 回复  |  直到 13 年前
        1
  •  5
  •   Mark Byers    13 年前

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

    若要获取所需内容,请使用“按汇总分组”而不是“按分组”。

    工会对此不起作用。

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

        2
  •  1
  •   Modafuka    13 年前

    有一种更快的方法。。。

    假设您只能在“result”字段中获得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,则可以添加更多的sum decode行,或执行上述PL/SQL过程。