2017-01-26 104 views
8

ben sonuç verisi buhesapla çalışan bakiyesi

gibi sorgu zaten yapılmış

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 

altında böyle running_balance biri sütun eklemek istediğiniz bu

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 

gibi verilere sahip

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

Ancak sonuç, hesaplanan miktar_a değil, sadece toplam miktar_b tutar.

** Güncelleştirmeler: Sorgulamamda zaten güncelleme yapıyorum.

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

kullanırken koşu denge sağa çalışıyor WHERE id = .... belirli id ​​ile durum. WHERE id = .... koşulunu silerken, yanlış gidiyor. Eğer tablolar açıklamasını eklerseniz

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

Running_balance nasıl tanımlanır? – Massimo

+0

Ek gereksinimleriniz için, '' ile başlayan satırlara id eklemeniz gerekir. Bir analitik fonksiyonda '' Partition by' '' Group by' 'bir toplu sorguda olduğu gibi çalışır - analitik fonksiyonun çalışmasını istediğiniz satır gruplarını belirler. – Boneist

cevap

5

Peşinde olduğun düşünüyorum. cp_id açılımı hangi

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 

Sadece sırayla bir sütun doldurmak gerekir:

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; 

o verir Tablolarınızdaki çevirmek çalışılıyor: numune verilerinden

İhtiyacınız sağlanan

+0

Ham veriler, çekimlerin sırasını belirlediğine benzeyen ek bir tanımlayıcı, 'cp_id' içerir. Bu yüzden analitik maddede ORDER BY kriteri olarak kullanılmalıdır. – APC

+0

OP'nin orijinal önerisinden b.amount tarafından sipariş verildim (her ne kadar ben fark etmemiştim ve OP, DESC anahtar sözcüğünü bu şekilde kaçırmıştı). – Boneist

+1

'desc =' CCP2 '' sırasına göre sıralama yapmazdım, ancak 'cp_id' ile sıralama yapardı. – APC

4

çok daha kolay olacaktır: