Oracle’da sql ile bakiye hesaplama

Oracle’da analitik fonksiyonları kullanarak bakiye hesaplanabilmektedir. Örneğimizde bakiye test tablosu oluşturup test verilerini giriyoruz. Hesaplama sutunu için SUM grup fonksiyonunu OVER ile kullanarak satır satır çalışmasını sağlıyoruz. ORDER BY ile toplama işlemini hangi sırayla yapılmasını gerektiğini belirtiyoruz.


create table bakiye_test (
  id number primary key,
  tarih date not null,
  giren number not null,
  cikan number not null
);


insert into bakiye_test values (1,'05.04.2010',100,0);
insert into bakiye_test values (2,'07.04.2010',0,200);
insert into bakiye_test values (3,'09.04.2010',300,0);
insert into bakiye_test values (4,'10.04.2010',100,0);
insert into bakiye_test values (5,'12.04.2010',0,50);
insert into bakiye_test values (6,'19.04.2010',50,0);
insert into bakiye_test values (7,'21.04.2010',0,30);
commit;


SQL> SELECT B.*, SUM( GIREN-CIKAN ) OVER (ORDER BY TARIH ASC ) BAKIYE FROM BAKIYE_TEST B;

        ID TARIH            GIREN      CIKAN     BAKIYE
---------- ----------- ---------- ---------- ----------
         1 05.04.2010         100          0        100
         2 07.04.2010           0        200       -100
         3 09.04.2010         300          0        200
         4 10.04.2010         100          0        300
         5 12.04.2010           0         50        250
         6 19.04.2010          50          0        300
         7 21.04.2010           0         30        270

7 rows selected

5 thoughts on “Oracle’da sql ile bakiye hesaplama”

  1. Hocam iyi günler.
    Uzun zamandır Sql 2005 de bakiye hesaplatmaya calısııyorum.Internette o kadar arastırmama ragmen hiçbirşey bulamadım.
    ve istegiğimi yapan tek sql sorgusu sizin kodunuz.
    Ama sqlde çalıstıramıyorum bu kodu da malum oracle.
    Rica etsem sql 2005de çalısacak halini mailime gonderebilirmisiniz? veya bana bi çıkıs yolu gösterirmisiniz?

    Tesekkür ederim.İyi çalışmalar.

  2. merhabalar, vermiş olduğunuz koda göre bakiye over (order by tarih) ile hesaplanınca o gün için olan bakiyeyi veriyor..fakat aynı gün içinde birden fazla işlem yapıldığında anlık bakiyeyi doğru göstermiyor..onun yerine OVER(ORDER BY ID) yazılırsa anlık bakiyeyi doğru bir şekilde görebiliyoruz gibi geliyor bana..

    sorum şu ki insert syntax’ındaki ‘01.01.2000’ formatını benim oracle 11g kabul etmiyor, ancak to_date(‘01.01.2000′,’dd.mm.yyyy’) şeklinde dönüşüm yaptığım zaten insert kabul ediyor..bunun nedenini sorabilir miyim ? acaba versiyon farkından mı ?

    1. Merhaba,
      Over kullamını anlatmak için hazırlanmış bir örnekti, ORDER BY’la tekil olacak şekilde sıralama verilirse düzgün olarak çalışacaktır. İhtiyaca göre ID verilebileceği gibi TARIH,ID’de verilebilir.

      Tarih formatı ile ilgili olarakta NLS ayarlarınıza bakmanız gerekebilir.
      Sessiona ait NLS bilgilerini almak için :
      SELECT * FROM NLS_SESSION_PARAMETERS;

      Sistem tarihini geçerli format türünde görmek için:
      select sysdate from dual;
      SYSDATE
      ----------
      13.02.2011

      Setting Up a Globalization Support Environment
      Oracle Date Functions

Leave a Reply

Your email address will not be published. Required fields are marked *