2015-06-08 3 views
10

Ich habe diese TabelleWie() in eine andere Spalte jede Zeile SUM

| ID_prim | ID (FKey) | Date   | Moved Items | 
|:-----------|:------------|-------------:|:------------:| 
| 1003  | 12_1  | nov 2013 | 2   | 
| 1003  | 12_2  | okt 2013 | 3   | 
| 1003  | 12_3  | dec 2014 | 5   | 
| 1003  | 12_4  | feb 2015 | 10  | 
| 1003  | 12_5  | apr 2012 | 1   | 
| 1003  | 12_11  | jan 2011 | 5   | 

Ich möchte die gleiche Tabelle abzufragen wie folgt:

  1. Bestellen Sie das Datum von desc
  2. Summe jeder 'Artikel verschieben' pro Zeile
  3. Stoppen Sie die Abfrage, wenn die Summe meinen gewünschten Betrag erreicht
  4. Mein gewünschter Betrag beginnt mit der MAX 'Summe Summe '(26) und subtrahiert den Betrag I (16)
  5. wollen

Wie so

| ID_prim | ID (FKey) | Date   | Moved Items | Summed Total | 
|:-----------|:------------|-------------:|:------------:|:------------:| 
| 1003  | 12_4  | feb 2015 |  10  |  26 
| 1003  | 12_3  | dec 2014 |  5  |  16 
| 1003  | 12_3  | nov 2013 |  2  |  11 < 
| 1003  | 12_4  | okt 2013 |  3  |  9 
| 1003  | 12_5  | apr 2012 |  1  |  6 
| 1003  | 12_11  | jan 2011 |  5  |  5 

Ich möchte die Abfrage stoppen, wenn i "Summed Total" (26) erreichen - 16 = 10. So Zeige mir alles von 10> Ich würde nur diese Werte in der Datenbank bekommen.

| ID_prim | ID (FKey) | Date   | Moved Items | Summed Total | 
|:-----------|:------------|-------------:|:------------:|:------------:| 
| 1003  | 12_4  | feb 2015 |  10  |  26 
| 1003  | 12_3  | dec 2014 |  5  |  16 
| 1003  | 12_3  | nov 2013 |  2  |  11 

Was ich habe, ist die folgende

SELECT 
    T1.ID_prim, T1.ID as ID (FKey), T1.Moved_Items as Moved Items, t1.Date, SUM(T2.MOVEMENTQTY) AS Summed Total 
    FROM Table1 T1 
    INNER JOIN Table1 T2 ON T2.ID <= T1.ID 
    inner join table2 inout on T1.ID_prim = inout.ID_prim 
    AND T2.ID_prim = inout.ID_prim 
    AND T2.ID_prim = T1.ID_prim 
    where t1.ID_prim = 1003 
    and t2.ID_prim = 1003 
    and inout.ISSOTRX = 'N' 
    GROUP BY T1.ID_prim, T1.Moved Items, t1.Date 
    HAVING SUM(T2.Moved Items) <= 16 
    order by t1.UPDATED desc 

Aber die Summe funktioniert nicht wirklich. Kann mir jemand helfen, die SQL-Anweisung für Oracle DB zu machen, die meine Wunschtabelle drucken wird?

+0

'nov 2013' ist kein ** DATUM **. Bitte geben Sie einige Beispieldaten an, die 'to_date' für die Datumswerte verwenden. –

+0

@LalitKumarB Ich habe das obige Datum nicht geschrieben. In der DB sieht meine Datumsspalte wie folgt aus: "2015-06-08 11:52:00" und es ist ein DATE-Wert. Aber das ist nicht der Schwerpunkt hier. Der Hauptfokus liegt auf der Summierten Summe und wie man iteriert – Igoranze

+0

Sollte nicht die Gesamtsumme "27" und nicht "26" sein? –

Antwort

4

Basierend auf OP Abklärungen über Kommentare zu der Frage, könnte es SUM() analytische Funktion erhält den laufenden Gesamt und dann filtert basierend auf der Bedingung geschehen verwenden.

Tabelle:

SQL> SELECT * FROM t; 

    ID_PRIM ID DT    MOVED 
---------- ----- --------- ---------- 
     1003 12_1 01-NOV-13   2 
     1003 12_2 01-OCT-13   3 
     1003 12_3 01-DEC-14   5 
     1003 12_4 01-FEB-15   10 
     1003 12_5 01-APR-12   1 
     1003 12_11 01-JAN-11   5 

6 rows selected. 

SQL> 

laufene Gesamt

SQL> SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 
     1003 12_1 01-NOV-13   2   11 
     1003 12_2 01-OCT-13   3   9 
     1003 12_5 01-APR-12   1   6 
     1003 12_11 01-JAN-11   5   5 

6 rows selected. 

SQL> 

Wunsch Ausgang

SQL> WITH DATA AS 
    2 (SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC 
    3 ) 
    4 SELECT * FROM data WHERE sm >= 16; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 

SQL> 

Bitte beachten Sie, dass, nov 2013 ist kein Datum, es ist eine Zeichenfolge. Da Sie nach Datum sortieren möchten, müssen Sie immer TO_DATE verwenden, um es explizit in date zu konvertieren. Jedenfalls habe ich TO_DATE verwendet, um die Beispieldaten zu erstellen.

aktualisieren OP will seinen Sollwert von der MAX Wert der aufsummiert Werte zur Laufzeit subtrahieren.

SQL> WITH DATA AS 
    2 (SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC 
    3 ) 
    4 SELECT * FROM DATA t WHERE sm > 
    5 (SELECT MAX(sm) FROM data 
    6 ) - 16 ; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 
     1003 12_1 01-NOV-13   2   11 

SQL> 

In der aktualisierten Abfrage MAX (sm) kehrt 26, und dann werden die Reihen auf dem Zustand WHERE sm > MAX(sm) -16 filtriert, das alle Zeilen bedeutet zurück, wo die ‚sm‘ Wert größer als 26 -16 d.h. 10 ist.Sie könnten eine Substitutionsvariable verwenden, um zur Laufzeit den Wert 16 einzugeben.

+0

Schließen, aber ich will nicht um von 0 zu starten und dann zu zählen und zu checken von wo mein> = 16 startet. Ich möchte sie zuerst alle wie in der Tabelle "Laufende Summe" zählen und dann vom Maximalwert (26) meinen gewünschten Wert (16) subtrahieren. Was würde passieren, wenn eine weitere Zeile oberhalb der ID_PRIM ID DT MOVED SM hinzugefügt wird ---------- ----- --------- -------- - ---------- 1003 12_9 02-FEB-15 10 36 1003 12_4 01-FEB-15 10 26 dann zeigt auch mein "Gewünschter Ausgang" den letzten addierten Wert an. Wo ich dann von MAX (36) starten und – Igoranze

+0

@Igoranze subtrahieren soll Ok, siehe mein Update. In der aktualisierten Abfrage gibt MAX (sm) 26 zurück, und dann werden die Zeilen unter der Bedingung WHERE sm> MAX (sm) -16 gefiltert, was bedeutet, dass alle Zeilen zurückgegeben werden, in denen der 'sm'-Wert größer als 26 -16 ist Sie könnten eine Substitutionsvariable verwenden, um den Wert 16 zur Laufzeit einzugeben. –

+0

Danke Kumpel, arbeitete! – Igoranze