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

Foreign Key ile bağlantı kurulmuş kayıtlarda güncelleme yapmak.

Primary Key – Foreign Key ilişkisi kurulmuş olan bir yapıda,  foreign key olan alanların değerini yeni bir değerle nasıl değiştirebiliriz?

Bir örnek ile açıklamaya çalışalım; Müşteri ve ödeme  bilgilerini içeren iki tablomuz ve aralarında Müşteri id üzerinden foreign key bağlantısı olmuş olsun. Müşteri bilgileri tablosunda A firmasının ikinci bir kaydının A* şeklinde açılmış olduğunu ve bu yanlış açılan firma için ödeme bilgisi girildiğini kabul edelim. A* firmasının yanlış açılmış bir kayıt olduğunu, A* firmasına yapılan ödeme bilgilerinin A firması olarak değiştirilmesi gerektiğinde ödeme bilgilerindeki Müşteri id’sinin güncellenmesi gerekecektir.  Tek tablo için bir update yeterli iken 100’den fazla tabloda update yapılması gerektiğinde ne yapılmalıdır? İlgili tabloya foreign key’le bağlı olan tabloları ve ilişkili olan alanları bulup  alandaki değerleri güncellemek en kestirme yol olacaktır.

Şöyle ki:

drop table odeme_test;
drop table musteri_test;

create table musteri_test (
   musteri_id number primary key,
   adi varchar2(20)
);


create table odeme_test (
   musteri_id number references musteri_test(musteri_id) ,
   tutar number
);

insert into musteri_test values (1,'A FIRMASI');
insert into musteri_test values (2,'B FIRMASI');
insert into musteri_test values (3,'A* FIRMASI');

insert into odeme_test values (1,10);
insert into odeme_test values (2,-10);
insert into odeme_test values (3,20);
insert into odeme_test values (1,-20);
insert into odeme_test values (2,30);
insert into odeme_test values (3,-30);
commit;

SQL> select * from musteri_test;

MUSTERI_ID ADI
---------- --------------------
         1 A FIRMASI
         2 B FIRMASI
         3 A* FIRMASI

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         3         20
         1        -20
         2         30
         3        -30

6 satırları seçildi.

Güncellemeleri yapacak sql’ler oluşturuluyor…

SQL> select
 'UPDATE '|| a.OWNER ||'.'|| c.TABLE_NAME ||
 ' SET '|| c.COLUMN_NAME ||'=&YENI'||
 ' WHERE '|| c.COLUMN_NAME ||'=&ESKI;' update_sql
 from
 all_constraints a,
 all_cons_columns c
 where
 a.constraint_type = 'R'
 and a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
 and r_constraint_name in
 (
 select constraint_name
 from all_constraints
 where constraint_type in ('P')
 and table_name = 'MUSTERI_TEST'
 );

yeni değerini girin: 1
eski 3: ' SET '|| c.COLUMN_NAME ||' = &YENI'||
yeni 3: ' SET '|| c.COLUMN_NAME ||' = 1'||
eski değerini girin: 3
eski 4: ' WHERE '|| c.COLUMN_NAME ||'= &ESKI;' update_sql
yeni 4: ' WHERE '|| c.COLUMN_NAME ||'= 3;' update_sql
UPDATE_SQL
-------------------------------------------------------
UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

SQL> UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

2 satırları güncellendi.

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         1         20
         1        -20
         2         30
         1        -30

6 satırları seçildi.

SQL>

Excel’de yıl, ay, gün olarak yaş hesaplama

Excel’de iki tarih arasındaki farkı yıl, ay,gün olarak hesaplamanız gerekebilir.

Yukarıdaki gibi bir hesaplama yapmak için

Yıl hesaplaması için C2 hücresine:

=YIL(B2)-YIL(A2)-EĞER(YADA(AY(B2)<AY(A2);VE(AY(B2)=AY(A2);GÜN(B2)<GÜN(A2)));1;0)

Ay hesaplaması için D2 hücresine:

=AY(B2)-AY(A2)+EĞER(VE(AY(B2)<=AY(A2);GÜN(B2)<GÜN(A2));11;EĞER(VE(AY(B2)<AY(A2);GÜN(B2) >=GÜN(A2));12;EĞER(VE(AY(B2)>AY(A2);GÜN(B2)<GÜN(A2));-1)))

Gün hesaplaması için E2 hücresine:

=B2-TARİH(YIL(B2);AY(B2)-EĞER(GÜN(B2)<GÜN(A2);1;0);GÜN(A2))

Resimdeki excel dosyasını indirmek için tıklayın!

http://support.microsoft.com/kb/214094/tr