2016-07-08 16 views
0

Ich habe Probleme mit der Auswahl der Summe der Salden für bestimmte Acc, Nam für einen bestimmten Zeitraum.ORACLE SQL Wählen Sie nur MAX jeder Gruppe durch Nummer

SELECT Acc, Nam, SUM(Bal) FROM table WHERE 
MAX(Par) = (SELECT Par WHERE Acc IN (101,102) AND Dat >1105 AND Dat <1405) 
AND Acc IN (101,102) AND Dat >1105 AND Dat <1405 
GROUP BY Acc, Nam 


Acc --- Nam --- Bal --- Par --- Dat 
101 --- One --- 150 --- 131 --- 1205 
101 --- One --- 120 --- 132 --- 1205 
101 --- One --- 160 --- 133 --- 1305 
102 --- Two --- 190 --- 121 --- 1205 
102 --- Two --- 110 --- 122 --- 1305 
102 --- Two --- 150 --- 123 --- 1305 

soll die endgültige Ausgabe sein:

Acc --- Nam --- Bal 
101 --- One --- 280 
102 --- Two --- 340 

So wird es von Konto und Kontonamen getrennt innerhalb der Frist aller Salden summiert. Es sollten nur Salden mit der höchsten Par-Nummer pro Tag addiert werden. Bitte beraten.

UPDATE

Ich habe es mit unter row_number Methode, aber was erhielt ich nur die Summe aller Zeilen (ohne einige von ihnen). Unten ist der Code, der zeigt: zwei Konten, zwei Kontobeschreibungen, Parameter, Daten und Kontostand. Ich möchte zwei Zeilen sehen, die die Summe aller Daten in einem Bereich für ein bestimmtes Konto mit der höchsten Parameternummer an einem separaten Tag sein werden. Die endgültige Ausgabe sollte nur aus drei Spalten bestehen: Konto, Name und Kontostand. Diese Abfrage sollte in der Lage sein, den maximalen Parameter eines jeden Tages auszuwählen und alle diese maximalen Werte zu einem Konto zu addieren.

SELECT h.account, h.name, h.paramet, h.date, h.balance 
    FROM h 
    WHERE TRUNC(h.date) > '01-Jun-16' AND TRUNC(h.date) < '10-Jun-16' 
    AND h.account IN ('410212','410213') 
    AND h.fund LIKE 'SSPSP 
+0

Heißt das, dass das nicht funktioniert: AUSWÄHLEN Acc, Nam, SUM (Bal) aus Tabelle WHERE Acc IN (101,102) UND Dat> 1105 UND Dat <1405 GROUP BY Acc, Nam –

+0

MAX() kann nicht in WHERE-Anweisungen gehen aber Sie können es in HAVING-Klausel setzen, die after bestimmt wird r die Gruppierung und Aggregation. Weiter (SELECT Par WHERE Acc IN (101,102) AND Dat> 1105 AND Dat <1405) ist nicht einmal gültig, da sie keine Tabelle oder Anything identifiziert. Die von Ihnen gepostete Abfrage würde Ihnen nicht einmal die Ergebnisse geben, die Sie anzeigen – Matt

+0

@Matt Eingabeabfrage sollte sein: 'SELECT h.account, h.name, h.paramet, h.date, h.balance VON h WHERE TRUNC (h.date)> '01 -Jun-16 'UND TRUNC (h.date) <'10 -Jun-16' UND h.account IN ('410212', '410213') UND h.fund LIKE 'SSPSP' –

Antwort

3

Sie können row_number() für diesen Einsatz:

SELECT Acc, Nam, SUM(Bal) 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY Acc, Nam, Dat ORDER BY Par DESC) as seqnum 
     FROM table t 
     WHERE Acc IN (101,102) AND Dat > 1105 AND Dat < 1405 
    ) t 
WHERE seqnum = 1 
GROUP BY Acc, Nam; 
+0

kann nicht bearbeiten, um das doppelte FROM zu entfernen, da die Bearbeitung <6 Zeichen ist, aber es ist zweimal –

+0

@RobGudgeon. . . Vielen Dank. –

+0

@GordonLinoff - danke, aber diese Abfrage zeigt die Summe von fast allen Zeilen, aber nicht die Summe der Zeilen mit max Parameter für jeden Tag innerhalb des gleichen Kontos. –

0

ich nächste Frage müssen obige Abfrage verwendet. Wie kann ich eine Tabelle mit zwei SUM (Bal) -Spalten mit unterschiedlichen Datum für einander erstellen:

Zubehör --- Nam --- Bal (Dat1) - Bal (Dat2)
101 --- One - ------ 280 ---------- 300
102 --- Zwei ------- 340 ---------- 180

SELECT Acc, Nam, SUM(Bal) 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum 
     FROM table t 
     WHERE Acc IN (101,102) AND Dat = 1105 
    ) t 
WHERE seqnum = 1 
GROUP BY Acc, Nam; 

SELECT Acc, Nam, SUM(Bal) 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum 
     FROM table t 
     WHERE Acc IN (101,102) AND Dat = 1405 
    ) t 
WHERE seqnum = 1 
GROUP BY Acc, Nam; 
Verwandte Themen