2017-01-26 12 views
8

Mam danych jak tenoblicz działa bilans w zapytaniu oracle

id cp_id amount_a  amount_b 
CCP1 TTP01 10.000.000  2.000.000 
CCP1 TTP02 10.000.000  3.000.000 
CCP1 TTP03 10.000.000  1.000.000 
CCP1 TTP04 10.000.000  500.000 
CCP2 TTP05 5.000.000  1.000.000 
CCP2 TTP06 5.000.000  2.000.000 
CCP3 TTP07 1.000.000  500.000 

Chcę, aby dane wynikowe dodać jedną kolumnę running_balance jak ten poniżej

id  amount_a  amount_b  running_balance 
CCP1 10.000.000  2.000.000  8.000.000 
CCP1 10.000.000  3.000.000  5.000.000 
CCP1 10.000.000  1.000.000  4.000.000 
CCP1 10.000.000  500.000  3.500.000 
CCP2 5.000.000  1.000.000  4.000.000 
CCP2 5.000.000  2.000.000  2.000.000 
CCP3 1.000.000  500.000  500.000 

zrobiłem już zapytanie jak to

/* Formatted on 1/26/2017 2:50:06 PM (QP5 v5.115.810.9015) */ 
    SELECT B.NO_KLAIM AS id, 
      a.amount AS amount_a, 
      B.AMOUNT AS amount_b, 
      SUM (A.AMOUNT) OVER (ORDER BY B.AMOUNT ROWS UNBOUNDED PRECEDING) 
       AS running_balance 
    FROM  TRX_TITIPAN A 
      JOIN 
       TRX_KLAIM_TITIPAN B 
      ON A.NO_RESI_TITIPAN = B.NO_RESI_TITIPAN 
GROUP BY B.NO_KLAIM, B.AMOUNT, a.amount 

, ale wynik nie został obliczony amount_a, po prostu łączna kwota dla kwoty_b.

** Zaktualizowano: Aktualizuję już moje zapytanie.

/* Formatted on 1/26/2017 2:50:06 PM (QP5 v5.115.810.9015) */ 
     SELECT B.NO_KLAIM AS id, 
       a.amount AS amount_a, 
       B.AMOUNT AS amount_b, 
       NVL (TITIP.AMOUNT, 0) 
       - SUM (NVL (KLAIM.AMOUNT, 0)) 
        OVER (PARTITION BY TITIP.AMOUNT 
          ORDER BY TITIP.NO_RESI_TITIPAN, 
            KLAIM.NO_KLAIM, 
            TITIP.AMOUNT, 
            KLAIM.AMOUNT asc 
          ROWS UNBOUNDED PRECEDING) as running_balance 
     FROM  TRX_TITIPAN A 
       JOIN 
        TRX_KLAIM_TITIPAN B 
       ON A.NO_RESI_TITIPAN = B.NO_RESI_TITIPAN 
    GROUP BY B.NO_KLAIM, B.AMOUNT, a.amount 

bilans bieganie działa prawidłowo podczas korzystania WHERE id = .... warunkiem, ze szczególnym id. Podczas gdy ja usuwam WHERE id = .... warunek będzie źle.

+0

Jak zdefiniowano running_balance? – Massimo

+0

Aby spełnić dodatkowe wymagania, należy podać identyfikator w klauzuli "według". "Partycja wg" w funkcji analitycznej działa w taki sam sposób, jak "Grupuj według" w zapytaniu zbiorczym - określa grupy wierszy, w których ma działać funkcja analityczna. – Boneist

Odpowiedz

5

myślę, że jesteś po:

SELECT B.NO_KLAIM AS id, 
     a.amount AS amount_a, 
     B.AMOUNT AS amount_b, 
     a.amount - SUM (B.AMOUNT) 
        OVER (partition by b.no_klaim ORDER BY B.cp_id ROWS UNBOUNDED PRECEDING) 
       AS running_balance 
FROM  TRX_TITIPAN A 
      JOIN 
       TRX_KLAIM_TITIPAN B 
      ON A.NO_RESI_TITIPAN = B.NO_RESI_TITIPAN 
+0

Surowe dane zawierają dodatkowy identyfikator, 'cp_id', który wygląda tak, jak określa kolejność wypłat. Dlatego powinno być używane jako kryterium ORDER BY w klauzuli analitycznej. – APC

+0

Miałem zamiar z pierwotnego proponowanego zapytania OP, gdzie zamówił je b.amount (chociaż nie zauważyłem, że ja i OP pominięto słowo kluczowe DESC w tym rodzaju). – Boneist

+1

Sortowanie według 'amount desc' nie wyjaśniałoby kolejności dla' id = 'CCP2'', ale sortowanie według 'cp_id' byłoby. – APC

4

Byłoby dużo łatwiej, jeśli dołączyć opis tabel.

Z danych próbki podałeś trzeba:

select id, amout_a, amount_b, 
     amount_a - sum(amount_b) over (partition by id order by id, cp_id) as running_balance 
    from table; 

Starając się przełożyć je na swoich tablicach daje:

SELECT B.NO_KLAIM AS id, 
     a.amount AS amount_a, 
     B.AMOUNT AS amount_b, 
     a.amount - SUM(B.AMOUNT) OVER (PARTITION BY B.NO_KLAIM ORDER BY B.NO_KLAIM/*, HERE PUT WHAT IS cp_id*/) AS running_balance 
FROM  TRX_TITIPAN A 
     JOIN 
      TRX_KLAIM_TITIPAN B 
     ON A.NO_RESI_TITIPAN = B.NO_RESI_TITIPAN 

Wystarczy wypełnić jedną kolumnę, aby przez co oznacza cp_id