2010-11-22 10 views
0

Gegeben zusammenfassen, dass ich eine Tabelle von Benutzerdaten enthält, wie folgt aus:Wie in PL/SQL

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 

Jetzt möchte ich es so zusammenfassen:

userID  result1 result2 
1    2   1 
2    2   0 
3    2   2 
(total)  6   3 

für mich, Zusammenfassung Benutzerdaten sind in Ordnung, aber wie kann ich die Gesamtzeile in einer Abfrage hinzufügen? UNION funktioniert damit nicht.

Vielen Dank dafür.

EDIT: das ist meine aktuelle Abfrage, natürlich funktioniert es nicht:

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; 
+0

Gibt es einen Grund, warum Sie einen 'FULL OUTER JOIN' verwenden? Dies macht wahrscheinlich mehr Arbeit als nötig, da es aussieht, dass Sie eigentlich einen 'RIGHT OUTER JOIN' wollen, es sei denn, ich täusche mich. Und es wird eine ganze Menge von Null-Zeilen zurückbringen, da Sie c.USERID anstelle von u.ID –

+0

verwenden, was ich wollte. Wenn in Gridcontrol angezeigt wird, wird der Nullwert in 0 konvertiert, wenn ich RIGHT OUTER JOIN nicht verwende, wird der Benutzer, der keinen Anruf hat, ignoriert. – Vimvq1987

Antwort

5

Ich nehme an, Sie GROUP BY verwenden, um Ihr aktuelles Ergebnis zu erzeugen. (PS: Bitte posten Sie Ihre aktuelle Anfrage, da es ziemlich schwierig ist zu erraten, was Sie tun, um dieses Ergebnis zu erhalten).

Um zu bekommen, was Sie wollen, verwenden Sie GROUP BY ROLLUP statt GROUP BY.

UNION funktioniert nicht mit diesem.

Ja, das wird auch funktionieren. Aber ich würde eher UNION ALL als UNION vorschlagen, da Ihre Ergebnismenge bereits nur bestimmte Zeilen zu enthalten scheint, so dass es keinen Sinn macht, zusätzliche Berechnungszeit zu verwenden, um doppelte Zeilen zu entfernen.

+0

Vielen Dank. Ich habe die Abfrage hinzugefügt :) – Vimvq1987

+1

@ Vimvq1987: Ändern Sie "Gruppe von USERID" zu "Gruppe von Rollup (USERID)". –

1

Es ist ein bisschen schneller Weg, dies zu tun ...

Sie nur einen Wert von 1 oder 2 auf dem Feld „Ergebnis“ bekommen Unter der Annahme, würde dies funktionieren:

SELECT userid 
,  SUM(DECODE (result, 1, 1, 0)) as result1 
,  SUM(DECODE (result, 2, 1, 0)) as result2 
FROM x 
GROUP BY userid; 

Diese die erwartete Ausgabe erzeugen würde:

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

Wenn die möglichen Werte auf dem Feld Ergebnis mehr als 1 oder 2 sind, könnten Sie mehr Summe-decode Zeilen oder tun, um die oben genannten PL/SQL-Prozedur hinzuzufügen.

+0

Altough DECODE ist kompakter, mit CASE ist flexibler und auch mehr Standard-SQL. – gpeche