2016-06-02 12 views
0

Ich brauche Hilfe, herauszufinden, wie die folgende SQL-Abfrage aus einer Oracle-Datenbank zu verfeinern:SQL Query Probleme Ausfiltern Summiert

SELECT DISTINCT 
    PR.DOC_ID, PR.AMEND_NO, LEDGER.ACCT_ID, APPRVL_CHAIN.APPRVR, 
    SUM(LEDGER.COMMIT) 
FROM 
    LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN, 
    LUFSMGR.LEDGER LEDGER, 
    LUFSMGR.PR PR 
WHERE 
    PR.DOC_ID = LEDGER.DOC_ID 
    AND LEDGER.DOC_ID = APPRVL_CHAIN.DOC_ID 
    AND APPRVL_CHAIN.AMEND_NO = LEDGER.AMEND_NO 
    AND LEDGER.AMEND_NO = PR.AMEND_NO 
    AND ((PR.DOC_ID Like '2116%') 
     AND (LEDGER.ACCT_ID Like '25601 105300SD%') 
     AND (APPRVL_CHAIN.APPRVR_ROLE='Funds Manager')) 
GROUP BY 
    PR.DOC_ID, PR.AMEND_NO, LEDGER.ACCT_ID, APPRVL_CHAIN.APPRVR 
HAVING 
    (SUM(LEDGER.COMMIT) <> 0) 
ORDER BY 
    PR.DOC_ID 

Diese in Daten ergibt, deren Probe sieht wie folgt aus:

Sample Data

Ich muss alle Doc_ID herausfiltern, wo die Summe der Verpflichtungen einschließlich der Änderungen = 0 ist. Zum Beispiel sollte Doc_ID 21162465SD541 herausgefiltert werden, da die Summe von Ammend_No 0,1 und 2 0 ist.

+1

Was läuft falsch? – Hogan

+1

Was genau ist das Problem? – Mureinik

+0

[Schlechte Angewohnheiten zu kicken: Verwenden von alten JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** vor mehr als 20 Jahren **) und die Verwendung wird davon abgeraten –

Antwort

2

Wenn Sie Informationen auf Dokumentebene wollen, dann sind nur die in der GROUP BY:

SELECT PR.DOC_ID, Sum(LEDGER.COMMIT) 
FROM LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN JOIN 
    LUFSMGR.LEDGER LEDGER 
    ON LEDGER.DOC_ID = APPRVL_CHAIN.DOC_ID AND APPRVL_CHAIN.AMEND_NO = LEDGER.AMEND_NO JOIN 
    LUFSMGR.PR PR 
    ON PR.DOC_ID = LEDGER.DOC_ID AND AND LEDGER.AMEND_NO = PR.AMEND_NO 
WHERE (PR.DOC_ID Like '2116%') AND 
     (LEDGER.ACCT_ID Like '25601 105300SD%') AND 
     (APPRVL_CHAIN.APPRVR_ROLE = 'Funds Manager') 
GROUP BY PR.DOC_ID 
HAVING Sum(LEDGER.COMMIT) <> 0 
ORDER BY PR.DOC_ID; 

Hinweise:

  • Lernen richtige JOIN Syntax zu verwenden. Einfache Regel: Nie Kommas in der FROM Klausel verwenden.
  • Mit SELECT DISTINCT mit GROUP BY ist fast nie das Richtige zu tun.
+0

Die Herausforderung besteht darin, dass ich noch die Amend_No, Account_ID und APPRVR für die Dokumente benötigen, die keine Gesamtverpflichtung von 0 haben. –

+0

Sie können ein 'JOIN' oder' IN' mit dieser Abfrage verwenden zusätzliches Detail. –