none
c# Sql Null alanlarda işlem RRS feed

  • Soru

  • merhaba sql tablomda hesaplama işlemi yapıyorum ama null alanları görmezden geliyor aşağıdaki sorguda 3000 tl olan bir personelin maaşı yapılan avans ve kesintiler yoksa maaş-topborc satırının sonucu 3000 dönmesi gerekirken 0 dönüyr nerede yanlış yapıyorum yardımcı olurmusunuz

    WITH Durum AS (SELECT        persId, SUM(CASE WHEN islemturu = 'Avans' THEN tutar END) AS TAvans, SUM(CASE WHEN islemturu = 'Kesinti' THEN tutar END) AS TKesinti, 
                                                                  SUM(CASE WHEN islemturu = 'Maas' THEN tutar END) AS TMaas, SUM(CASE WHEN islemturu = 'Avans' OR
                                                                  islemturu = 'Kesinti' THEN tutar END) AS TBorc
                                         FROM            personelicmal
                                         WHERE        (yil = @yil) AND (ay = @ay)
                                         GROUP BY persId)
        SELECT        p.Id AS personelId, p.adsoyad, p.tcno, p.maas, ISNULL(td.TAvans, 0) AS topavans, ISNULL(td.TKesinti, 0) AS topkesinti, ISNULL(td.TBorc, 0) AS topborc, 
                                  ISNULL(p.maas - td.TBorc, 0) AS gereken, ISNULL(td.TMaas, 0) AS topmaas, ISNULL(p.maas - td.TBorc - td.TMaas, 0) AS kalan
         FROM            personel AS p LEFT OUTER JOIN
                                  Durum AS td ON p.Id = td.persId


    • Düzenleyen tetee 26 Eylül 2019 Perşembe 07:59
    26 Eylül 2019 Perşembe 07:59

Yanıtlar

Tüm Yanıtlar

  • Isnull(p.maas - Isnull(td.tborc, 0), 0)


    www.cihanyakar.com

    • Yanıt Olarak İşaretleyen tetee 26 Eylül 2019 Perşembe 08:13
    26 Eylül 2019 Perşembe 08:08
  • Isnull(p.maas - Isnull(td.tborc, 0), 0)


    www.cihanyakar.com

    Hay Allah nasılda aklıma gelmedi saolasın :)
    26 Eylül 2019 Perşembe 08:13
  • Bir de eğer karakter kısıtınız yoksa sorguları daha okunaklı yazabilirsiniz veya bunlar için olan hazır araçları kullanabilirsiniz. İlk sorgunuz aşağıdaki gibi olsaydı daha iyi olmaz mıydı sizce?

    WITH DURUM AS
      (SELECT PERSID,
              SUM(CASE
                      WHEN ISLEMTURU = 'Avans' THEN TUTAR
                  END) AS TAVANS,
              SUM(CASE
                      WHEN ISLEMTURU = 'Kesinti' THEN TUTAR
                  END) AS TKESINTI,
              SUM(CASE
                      WHEN ISLEMTURU = 'Maas' THEN TUTAR
                  END) AS TMAAS,
              SUM(CASE
                      WHEN ISLEMTURU = 'Avans'
                           OR ISLEMTURU = 'Kesinti' THEN TUTAR
                  END) AS TBORC
       FROM PERSONELICMAL
       WHERE (YIL = @YIL)
         AND (AY = @AY) GROUP  BY PERSID)
    SELECT P.ID AS PERSONELID,
           P.ADSOYAD,
           P.TCNO,
           P.MAAS,
           ISNULL(TD.TAVANS, 0) AS TOPAVANS,
           ISNULL(TD.TKESINTI, 0) AS TOPKESINTI,
           ISNULL(TD.TBORC, 0) AS TOPBORC,
           ISNULL(P.MAAS - TD.TBORC, 0) AS GEREKEN,
           ISNULL(TD.TMAAS, 0) AS TOPMAAS,
           ISNULL(P.MAAS - TD.TBORC - TD.TMAAS, 0) AS KALAN
    FROM PERSONEL AS P
    LEFT OUTER JOIN DURUM AS TD ON P.ID = TD.PERSID



    www.cihanyakar.com




    • Düzenleyen Cihan Yakar 26 Eylül 2019 Perşembe 09:05
    • Yanıt Olarak Öneren canleveent 26 Eylül 2019 Perşembe 09:15
    26 Eylül 2019 Perşembe 09:03
  • Bir de eğer karakter kısıtınız yoksa sorguları daha okunaklı yazabilirsiniz veya bunlar için olan hazır araçları kullanabilirsiniz. İlk sorgunuz aşağıdaki gibi olsaydı daha iyi olmaz mıydı sizce?

    WITH DURUM AS
      (SELECT PERSID,
              SUM(CASE
                      WHEN ISLEMTURU = 'Avans' THEN TUTAR
                  END) AS TAVANS,
              SUM(CASE
                      WHEN ISLEMTURU = 'Kesinti' THEN TUTAR
                  END) AS TKESINTI,
              SUM(CASE
                      WHEN ISLEMTURU = 'Maas' THEN TUTAR
                  END) AS TMAAS,
              SUM(CASE
                      WHEN ISLEMTURU = 'Avans'
                           OR ISLEMTURU = 'Kesinti' THEN TUTAR
                  END) AS TBORC
       FROM PERSONELICMAL
       WHERE (YIL = @YIL)
         AND (AY = @AY) GROUP  BY PERSID)
    SELECT P.ID AS PERSONELID,
           P.ADSOYAD,
           P.TCNO,
           P.MAAS,
           ISNULL(TD.TAVANS, 0) AS TOPAVANS,
           ISNULL(TD.TKESINTI, 0) AS TOPKESINTI,
           ISNULL(TD.TBORC, 0) AS TOPBORC,
           ISNULL(P.MAAS - TD.TBORC, 0) AS GEREKEN,
           ISNULL(TD.TMAAS, 0) AS TOPMAAS,
           ISNULL(P.MAAS - TD.TBORC - TD.TMAAS, 0) AS KALAN
    FROM PERSONEL AS P
    LEFT OUTER JOIN DURUM AS TD ON P.ID = TD.PERSID



    www.cihanyakar.com




    ilk kez uygulama gördüm sizi, hep teorik bilgiler paylaşırdınız :)
    26 Eylül 2019 Perşembe 09:16
  • Aslında dediğiniz gibi okunaklı yazıyorum zaten ama ado.net dataset oluşturup query eklediğimde kendi böyle dağıtıyor ben formda görüntü verebilmek için query builder kullandım
    26 Eylül 2019 Perşembe 09:37
  • Aslında dediğiniz gibi okunaklı yazıyorum zaten ama ado.net dataset oluşturup query eklediğimde kendi böyle dağıtıyor ben formda görüntü verebilmek için query builder kullandım
    Saçma sapan kolon adları vermediğinizden dikkat ettiğiniz belli ama ben anlayışla karşılayacağını düşündüğüm kişileri  böyle konularda uyarıyorum.Ek olarak proje eski ve bakımını yapıyorsanız dataset, datatable tamam ama yeni projelerde bu hantal ve C#'ın statik tip anlayışına ters olan bu yapıları kullanmamanızı tavsiye ederim. 

    www.cihanyakar.com

    26 Eylül 2019 Perşembe 09:54
  • Aslında dediğiniz gibi okunaklı yazıyorum zaten ama ado.net dataset oluşturup query eklediğimde kendi böyle dağıtıyor ben formda görüntü verebilmek için query builder kullandım

    Saçma sapan kolon adları vermediğinizden dikkat ettiğiniz belli ama ben anlayışla karşılayacağını düşündüğüm kişileri  böyle konularda uyarıyorum.Ek olarak proje eski ve bakımını yapıyorsanız dataset, datatable tamam ama yeni projelerde bu hantal ve C#'ın statik tip anlayışına ters olan bu yapıları kullanmamanızı tavsiye ederim. 

    www.cihanyakar.com

    Teşekkür ederim zaten çoğu açtığım konuda da yardımcı oluyorsunuz önerilerinizi dikkate alıyorum, şuanki aşama bir revize daha önce yaptığım bir proje onun üzerinde değişiklik yapıyorum yeni projelerde linq to sql e.framwwork kullanmaya çalışyorum yani henüz öğrenme aşamasındayım tekrar teşekkür ederim kolay gelsin
    26 Eylül 2019 Perşembe 10:12