CoalEsce Kullanımı

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

CoalEsce Kullanımı

Mesaj gönderen Fatih! »

Merhaba,

Alınan ve Ödenen alanlarını kullanarak, bakiye ve bakiye türü adlı hesaplanmış alanları oluşturuyorum. Alınan ve Ödenen alanlarda null görülünce, dönen sonuç hatalı oluyor. İşin ilginç yanı bakiye alanında anormal bir durum yokken, bakiye türü alanı sorun çıkarıyor.

Bakiye alanını oluşturan kod:

Kod: Tümünü seç

(COALESCE((CASE 
WHEN ALINAN>ODENEN THEN ALINAN-ODENEN 
ELSE ODENEN-ALINAN END),
ALINAN,ODENEN,0))
Bakiye Türü alanını oluşturan kod:

Kod: Tümünü seç

(COALESCE((CASE 
WHEN ALINAN>ODENEN THEN 'Borç' 
WHEN ODENEN>ALINAN THEN 'Alacak' 
ELSE 'Yok' END),
ALINAN,ODENEN,0))
Sonuç:

Resim

Son 2 kaydın bakiye türüne dikkat ediniz.

Yorumu olan :roll:
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen aslangeri »

s.a.
coalesceyi casein içinde kullan.

Kod: Tümünü seç

...
case
when coalesce(alinan,0)>coalesce(odenen,0) then....
gibi.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen Fatih! »

Alternatif kullanımları biliyorum da, Yukarıdaki sonucun doğru sonuç döndürmemesine takıldım :roll:
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen aslangeri »

s.a.
burda case deki
when alinan>odenen derken taraflardan biri null olduğu için karşılaştırma işleminide sonucu bilemiyor ondan dolayı else de verilen işlemi yerine getiriyor.
çıkarma işleminde null u dikkate almadığınıda görüyoruz.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen Fatih! »

Çıkarma işlemini dikkate almazsa, bakiye alanı da null olurdu :P
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen t-hex »

COALESCE fonksiyonu parametreleri içerisinde NULL olmayan ilk değeri döndürür. Firebird'de de NULL olan bir değer ile yapılan >, < ve = işlemlerinin sonucu hep false olarak dönecektir. Örn: NULL > 1 = false, 2 > NULL = false vs..

bakiye hesaplarken COALESCE fonksiyonunun ilk parametresi CASE cümleciği, bunu hesapladığımızda "CASE
WHEN ALINAN>ODENEN " kısmı false gelecek, dolayısıyla else kısmı işleme alınacak "ODENEN-ALINAN". bu kısımda NULL değeri içeridiği için NULL dönecek. COALESCE fonksiyonu NULL olmayan bir değer bulamadığı için işlemeye devam edecek, İkinci sıradaki ALINAN değerine bakacak, bu da NULL (sondaki örnek için), devam edecek ODENEN kolonuna bakacak ve bunu döndürecek.

Bakiye Türü alanı hesaplanırkende aynı olaylar gerçekleşiyor. CASE cümleciği 3 şekilde dallanabilir fakat ALINAN veya ODENEN alanlarından birisi NULL olduğu zaman koşullar her zaman
FALSE
FALSE
olacak ve işlem sürekli ELSE'e düşecek ki öyle olmuş zaten.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: CoalEsce Kullanımı

Mesaj gönderen Hakan Can »

"Case When End" NULL döndürünce sonuçta COALESCE'nin sıradaki NULL olmayan değerini döndürüyor. Yani önce ALINAN,sonra ODENEN, o da NULL ise 0.

Bakiye her halukarda sayısal bir değer (en kötü ihtimalle 0) döndürüyor.

Yazmanız gereken SQL kodu (gerçi "aslangeri" gerekli bilgiyi vermiş) şu şekilde olmalı:

Kod: Tümünü seç

SELECT
  IDNO, ADI, SOYADI, ALINAN, ODENEN,
  CASE WHEN COALESCE(ALINAN, 0) > COALESCE(ODENEN, 0) THEN COALESCE(ALINAN, 0) - COALESCE(ODENEN, 0)
       WHEN COALESCE(ALINAN, 0) < COALESCE(ODENEN, 0) THEN COALESCE(ODENEN, 0) - COALESCE(ALINAN, 0) ELSE 0.0 END AS BAKIYE,
  CASE WHEN COALESCE(ALINAN, 0) > COALESCE(ODENEN, 0) THEN 'Borç'
       WHEN COALESCE(ALINAN, 0) < COALESCE(ODENEN, 0) THEN 'Alacak' ELSE 'Yok' END AS BAKIYE_TURU
FROM TABLO
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Re: CoalEsce Kullanımı

Mesaj gönderen Fatih! »

Şimmdi anladım hatamı :oops:

teşekkür ederim
Cevapla