2017-01-26 20 views
8

Tôi có dữ liệu như thế nàytính toán cân bằng chạy trong truy vấn 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 

Tôi muốn các dữ liệu kết quả thêm một cột của running_balance như thế này dưới đây

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 

tôi đã thực hiện các truy vấn như

này
/* 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 

nhưng kết quả không được tính toán số tiền, chỉ cần chạy tổng cho số tiền_b.

** Đã cập nhật: Tôi đã cập nhật truy vấn của mình.

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

sự cân bằng chạy được làm việc ngay khi sử dụng WHERE id = .... điều kiện, với id cụ thể. Trong khi tôi xóa WHERE id = .... điều kiện nó sẽ xảy ra sai.

+0

Làm cách nào để xác định được run_balance? – Massimo

+0

Đối với yêu cầu bổ sung của bạn, bạn cần phải bao gồm id trong phân vùng by' khoản. 'Phân vùng bằng' trong một hàm phân tích hoạt động giống như cách' Nhóm bởi' thực hiện trong một truy vấn tổng hợp - nó xác định các nhóm hàng mà bạn muốn hàm phân tích hoạt động. – Boneist

Trả lời

5

Tôi nghĩ rằng bạn đang sau:

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

Dữ liệu thô chứa một số nhận dạng bổ sung, 'cp_id', có vẻ như nó xác định thứ tự rút tiền. Vì vậy, nó nên được sử dụng như là tiêu chí ORDER BY trong mệnh đề phân tích. – APC

+0

Tôi đã đi từ truy vấn được đề xuất ban đầu của OP nơi họ đặt hàng bởi b.amount (mặc dù tôi đã không phát hiện ra rằng tôi và OP đã bỏ lỡ từ khóa DESC trong sắp xếp). – Boneist

+1

Sắp xếp theo 'số tiền desc' sẽ không giải thích thứ tự cho' id = 'CCP2'' nhưng sắp xếp theo 'cp_id' sẽ. – APC

4

Nó sẽ dễ dàng hơn nhiều nếu bạn đính kèm mô tả các bảng của bạn.

Từ dữ liệu mẫu mà bạn cung cấp bạn cần:

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; 

Cố gắng dịch nó vào các bảng của bạn nó mang lại:

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 

Bạn chỉ cần điền vào một cột theo thứ tự bằng cách viết tắt của cp_id

Các vấn đề liên quan