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
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.
Merhaba,
MsSql’ile pek uğraşmasamda aşağıdaki link faydalı olacaktır:
http://msdn.microsoft.com/en-us/library/ms189461.aspx
İyi çalışmalar.
İlginize tesekkür ederim hocam.sorunu çözdüm.İyi çalışmalar.
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ı ?
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