Как подвести итоги в PL / SQL - PullRequest
0 голосов
/ 22 ноября 2010

Учитывая, что у меня есть таблица, содержащая пользовательские данные, например:

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

Для меня суммирование данных пользователя - это хорошо, но как я могу добавить итоговую строку в запрос? 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;

Ответы [ 2 ]

5 голосов
/ 22 ноября 2010

Я предполагаю, что вы используете GROUP BY для создания текущего результата.(PS: Пожалуйста, опубликуйте ваш текущий запрос, так как довольно сложно угадать, что вы делаете, чтобы получить этот результат).

Чтобы получить то, что вы хотите, используйте GROUP BY ROLLUP вместо GROUP BY.

UNION не работает с этим.

Да, на самом деле это тоже будет работать.Но я бы предложил UNION ALL, а не UNION, поскольку ваш результирующий набор, похоже, уже содержит только отдельные строки, поэтому нет смысла использовать дополнительное время вычисления для поиска дублирующихся строк для удаления.

1 голос
/ 22 ноября 2010

Есть немного более быстрый способ сделать это ...

Если вы можете получить значение 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.

...