2015-06-08 16 views
10

Ho questa tabellaCome Sum() ogni riga in un'altra colonna

| 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   | 

voglio interrogare la stessa tabella come segue:

  1. condannare la Data entro disc
  2. Somma ogni 'Articolo spostato "per riga
  3. Interrompere la query se la somma raggiunge l'importo desiderato
  4. L'importo desiderato inizia dal totale' totale 'MAX' '(26) e sottrae la quantità che voglio (16)

Come così

| 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 

Voglio smettere di query quando raggiungo "sommata Total" (26) - 16 = 10. Quindi, Mostrami tutto da 10> Vorrei solo ottenere questi valori nel database.

| 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 

Quello che ho è il seguente

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 

Ma la somma non funziona davvero. Qualcuno può aiutarmi a fare la dichiarazione SQL per Oracle DB che stamperà la mia tabella desiderata?

+0

'nov 2013' NON è una ** DATA **. Fornisci alcuni dati di esempio usando 'to_date' per i valori di data. –

+0

@LalitKumarB Non ho scritto la data sopra. Nel DB la colonna della mia data appare come "2015-06-08 11:52:00" ed è un valore DATE. Ma questo non è l'obiettivo principale qui. L'obiettivo principale è il totale sommato e come iterare – Igoranze

+0

La somma totale non dovrebbe essere '27' e non' 26'? –

risposta

4

Sulla base di chiarimenti di OP tramite commenti sulla questione, che potrebbe essere fatto utilizzando SUM() funzione analitica per ottenere il esecuzione totale, e poi filtrare in base alla condizione.

Tabella:

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> 

Esecuzione totale in uscita

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> 

desiderata

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> 

prega di notare che, nov 2013 non è una data, è una stringa . Poiché devi ordinare in base alla data, devi sempre utilizzare TO_DATE per convertirlo esplicitamente in data. Ad ogni modo, ho usato TO_DATE per creare i dati di esempio.

Aggiornamento OP vuole sottrarre il suo valore desiderato dalla valore MAX dei valori riassunti in fase di esecuzione.

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> 

Nella query aggiornata, MAX (sm) ritorni 26, e poi le righe vengono filtrati a condizione WHERE sm > MAX(sm) -16 che significa restituire tutte le righe in cui il valore 'sm' è maggiore 26 -16 cioè 10.È possibile utilizzare una variabile di sostituzione per immettere il valore 16 in fase di esecuzione.

+0

Chiudi, ma non voglio per iniziare da 0 e poi contare e controllare da dove inizia il mio> = 16. Voglio prima contarli tutti come nella tabella 'Running total', e quindi dal valore massimo (26) sottrarre il mio valore desiderato (16). Cosa succederebbe se un'altra riga fosse aggiunta sopra l'ID ID_PRIM DT MOVED SM ---------- ----- --------- -------- - ---------- 1003 12_9 02-FEB-15 10 36 1003 12_4 01-FEB-15 10 26 quindi il mio "Uscita desiderata" mostrerà anche l'ultimo valore aggiunto. Dove poi voglio iniziare da MAX (36) e sottrarre – Igoranze

+0

@Igoranze Ok, vedere il mio aggiornamento. Nella query aggiornata, MAX (sm) restituisce 26, e quindi le righe vengono filtrate nella condizione WHERE sm> MAX (sm) -16 che significa restituire tutte le righe in cui il valore 'sm' è maggiore di 26 -16 cioè 10 È possibile utilizzare una variabile di sostituzione per immettere il valore 16 in fase di esecuzione. –

+0

Grazie amico, ha funzionato! – Igoranze