Toplam sütununu bir şarta bağlamak

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ı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Toplam sütununu bir şarta bağlamak

Mesaj gönderen serbek_tr »

Herkese Hayırlı çalışmalar dilerim. Arkadaşlar aşağıdaki kodda görmüş olduğunuz gibi 2 adet toplam sütunum var. Görüldüğü gibide bu kod verilen tarih arasında farklı kriterler doğrultusunda bana o kayıtların yani kişilerin toplamda yapmış olduğu ödemeyi ve ödenmesi gerekeni veriyor ancak buna ilave olarak 2 sütuna daha ihtiyacım var oda hiç birşey değişmeden sadece verilen ilk tarih kriterinden önceki tüm tarihler için ödenmiş ve ödenmesi gerekenlerin toplamı yani devir mantığı misali
yani

Kod: Tümünü seç

  SUM(Şarta bağlı toplam GELIRPROJE_HD.GPHD_ODENEN) AS devirODENEN,
  SUM(şarta bağlı toplam GELIRPROJE_HD.GPHD_ODENECEK) AS devirODENECEK,
Şeklinde olacak ama nasıl olacak. Teşekkür ederim


Ana Kodlama

Kod: Tümünü seç

SELECT 
  SUM(GELIRPROJE_HD.GPHD_ODENEN) AS ODENEN,
  SUM(GELIRPROJE_HD.GPHD_ODENECEK) AS ODENECEK,
  DAIRENO.DAIREKODU,
  DAIRENO.ID,
  GELIRPROJE_HD.GPHD_BORCLU,
  UYELER.ADI,
  UYELER.SOYADI,
  UYELER.ESKI
FROM
  GELIRPROJE_HD
  LEFT OUTER JOIN DAIRENO ON (GELIRPROJE_HD.GPHD_DAIRENO = DAIRENO.ID),
  UYELER
WHERE
  (GELIRPROJE_HD.GPHD_ODEMETARIHI >= 11.10.2007) AND
  (GELIRPROJE_HD.GPHD_ODEMETARIHI <= 12.12.2007)
GROUP BY
  DAIRENO.DAIREKODU,
  DAIRENO.ID,
  GELIRPROJE_HD.GPHD_BORCLU,
  UYELER.ADI,
  UYELER.SOYADI,
  UYELER.ESKI
HAVING
  (UYELER.ESKI = 0) OR 
  (UYELER.ESKI IS NULL)
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

UNION kullanarak öncekileri ayrı toplatabilirsin. Daha doğrusu SELECT teki alan sayıları ve tipleri aynı olan birden çok sorguyu bu şekilde birbirine ekleyebilirsin. Her biri farklı satırlar döndürür. ORDER BY kullanılacaksa tek SELECT miş gibi düşünülerek en sonuna eklenir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

FB desteklermi bilmem ama SQL Server'da CASE WHEN yapısı vardır. Mesela Türü 1 olan tutarlar Borç, 2 olanlar alacak olan bir tablodaki borç ve alacak tutarlarının toplamlarını göstermek gerekirse.

Kod: Tümünü seç

select KartAdi,
sum(case when Tur=1 then Tutar end) as Borç,
sum(case when Tur=2 then Tutar end) as Alacak
from Tablo
group by KartAdi
şeklinde bir sorgu ile şartlı sorgu yapabiliyorum. Muhtemelen FB içinde aynı durum geçerlidir.

CASE WHEN şart1 THEN deger1 WHEN şart2 THEN deger2 ELSE deger3 END
gibi bir yapısı vardır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Sabanakman arkadaşım öncelikle yardımın ve ilgin için teşekkür ederim. ancak bu soruyu sizlere sormadan önce formda dolaştım ve önerdiğin yolu daha önceden denedim firebird de bu olmuyor ve hatta sum içinde if şartınıda denedim gerçekleşmedi.

Rsimsek, sayın abiciğim dediğiniz mantık bana alt alta satırlar sunar ancak ben bunu bir örnekle izah edeyim

Kod: Tümünü seç

Adı               Ödenen      Ödenecek     Toplam
----            --------     -----------    --------
a                     0            100        100
b                    20            100         80
yukarıdaki sonucu zaten mevcut kod ile alıyorum diyelimki bu sonuç 01.10.2007 ile 12.12.2007 tarihleri arasındaki sonuç olsun ama ben bu sonucu şu şekilde geliştirmek istiyorum sonuca ilave olarak 01.10.2007 tarihinden önceki toplamlarıda eklemek istiyorum

Kod: Tümünü seç

                 01.10.07       01.07.07                        
                 ye kadar       ye kadar
Adı              Ödenen        Ödenecek        Toplam        Ödenen       Ödenecek      Top
----            --------        -----------    --------      --------    -----------     ---  
a                    100           100          0             0              100         100
b                    120           100           -20          20             100          80
istediğim bu işte şimdi sayılar arasında matematiksel alaka kurmayın rastgele yazdım sadece istediğim sonucun ne olduğunu anlatmak maksadıyla bu şekilde bir sonuç elde edersem zaten ilişki kurmak sorun değil. umarım anlatabilmişimdir. tekrar teşekkür ederim
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

sabanakman arkadaşım sen den özür diliyorum daha önce baktığım örmekte case when ifadesi if mantığnda kullanıldığı için eksikliğinden dolayı olmuyormuş verdiğin ifadeyi tekrar inceledim ve işimi gördü çok teşekkür ederim ve ayrıca tekrar özür dilerim. ancak istediğim sonucu almak için kodda değişiklik gerekti paylaşmak istedim
ve tekrar teşekkür ederim

Kod: Tümünü seç

SELECT 
  SUM(case when GELIRPROJE_HD.GPHD_ODEMETARIHI < '01.11.2007' then GELIRPROJE_HD.GPHD_ODENEN else 0 end) AS DODENEN,
  SUM(case when GELIRPROJE_HD.GPHD_ODEMETARIHI < '01.11.2007' then GELIRPROJE_HD.GPHD_ODENECEK else 0 end) AS DODENECEK,
  SUM(case when(GELIRPROJE_HD.GPHD_ODEMETARIHI >= '01.11.2007' AND GELIRPROJE_HD.GPHD_ODEMETARIHI <= '28.12.2007') then GELIRPROJE_HD.GPHD_ODENEN else 0 end) AS ODENEN,
  SUM(case when(GELIRPROJE_HD.GPHD_ODEMETARIHI >= '01.11.2007' AND GELIRPROJE_HD.GPHD_ODEMETARIHI <= '28.12.2007') then GELIRPROJE_HD.GPHD_ODENECEK else 0 end) AS ODENECEK,
  DAIRENO.DAIREKODU,
  DAIRENO.ID,
  GELIRPROJE_HD.GPHD_BORCLU,
  UYELER.ADI,
  UYELER.SOYADI,
  UYELER.ESKI
FROM
  GELIRPROJE_HD
  LEFT OUTER JOIN DAIRENO ON (GELIRPROJE_HD.GPHD_DAIRENO = DAIRENO.ID)
  LEFT OUTER JOIN UYELER ON (GELIRPROJE_HD.GPHD_DAIRENO = UYELER.DAIRENO)
WHERE
  (GELIRPROJE_HD.GPHD_BORCLU = 0)

GROUP BY
  DAIRENO.DAIREKODU,
  DAIRENO.ID,
  GELIRPROJE_HD.GPHD_BORCLU,
  UYELER.ADI,
  UYELER.SOYADI,
  UYELER.ESKI
HAVING
  (UYELER.ESKI = 0) OR 
  (UYELER.ESKI IS NULL)
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Çalıştı ise ne mutlu :wink: Bir de else 0 demene gerek yok galiba. Örneğimde de kullanmamıştım.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla