Sorguda Toplam Değerinin 4 Katı Olarak Gelmesi

05/10/2025, 15:47

truhi

Kıymetli Hocalarım Merhabalar

Ekli DB' de yer alan "qry_Customers" sorgusunda

IIf(IsNull(Sum(tbl_CasheMoves.Tutar)),0,Sum(tbl_CasheMoves.Tutar)) AS NakitGiris

satırında toplam değer 1440 olması gerekirken; 1440*4= 5760 sonucunu üretmektedir.

yardımcı olursanız çok sevinirim,

Kod:
SELECT qry_BankCustom.ID, qry_BankCustom.MusteriKod, qry_BankCustom.MusteriAdi, qry_BankCustom.Telefon, qry_BankCustom.Giris, qry_BankCustom.Cikis, qry_BankCustom.Bakiye, IIf(IsNull(Sum(tbl_Sales.Tutar)),0,Sum(tbl_Sales.Tutar)) AS ToplaTutar, SUM(tbl_CasheMoves.Tutar) AS NakitTahsilat
FROM (qry_BankCustom LEFT JOIN tbl_Sales ON qry_BankCustom.MusteriKod = tbl_Sales.MusteriKod) LEFT JOIN tbl_CasheMoves ON qry_BankCustom.MusteriKod = tbl_CasheMoves.CariKod
GROUP BY qry_BankCustom.ID, qry_BankCustom.MusteriKod, qry_BankCustom.MusteriAdi, qry_BankCustom.Telefon, qry_BankCustom.Giris, qry_BankCustom.Cikis, qry_BankCustom.Bakiye;


iyi pazarlar dilerim.
05/10/2025, 18:51

atoykan

Toplamları bankcustom ile Left joinden önce sorgulamalısınız aksi takdirde bahsettiğiniz çarpan etkisi karşınıza çıkar. Müşterinin tblsales tablosunda x, tblcashemoves tablosunda y kadar kaydı varsa bankcustom üzerinden join ile birleştirdiğinizde o müşteri için x*y kadar kayıt oluşur ve bunun üzerinden SUM işlemi yaparsanız kayıtlar tekrarlandığı için tutarlar birden çok kez hesaplamaya dahil edilmiş olur. O nedenle joinden önce her iki tabloda sorguyla toplam alıp müşteri bazında gruplamalı sonra join ile bankcustomla birleştirme yapmanız gerek. Buna göre çalışın olmaz ise toplantı çıkışında örneğinizi indirip yardımcı olmaya çalışırım başka hata var mı bakarak.
05/10/2025, 19:22

truhi

(05/10/2025, 18:51)atoykan yazdı: Toplamları bankcustom ile Left joinden önce sorgulamalısınız aksi takdirde bahsettiğiniz çarpan etkisi karşınıza çıkar. Müşterinin tblsales tablosunda x, tblcashemoves tablosunda y kadar kaydı varsa bankcustom üzerinden join ile birleştirdiğinizde o müşteri için x*y kadar kayıt oluşur ve bunun üzerinden SUM işlemi yaparsanız kayıtlar tekrarlandığı için tutarlar birden çok kez hesaplamaya dahil edilmiş olur. O nedenle joinden önce her iki tabloda sorguyla toplam alıp müşteri bazında gruplamalı sonra join ile bankcustomla birleştirme yapmanız gerek. Buna göre çalışın olmaz ise toplantı çıkışında örneğinizi indirip yardımcı olmaya çalışırım başka hata var mı bakarak.

Hocam ilginiz için çok teşekkür ederim,
işin içinden bir türlü çıkamıyorum, kafam iyice karıştı.
eklediğim dosyayı indirip; onun üzeriden yardımcı olursanız çok sevinirim.

iyi akşamlar.
Dün, 09:33

onur_can

Sorgunuzun en sonunda bulunan NakitTahsilat: Tutar alanının Toplam satırını İlk olarak değiştirin.
Dün, 10:32

atoykan

SELECT k.ID,k.MusteriKod,k.MusteriAdi,k.Telefon,k.Giris,k.Cikis,k.Bakiye,
Nz((SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod),0) AS ToplaTutar,
Nz((SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod),0) AS NakitTahsilat
FROM qry_BankCustom AS k;
yapmak istediğiniz sorgu. Şöyle açıklayayım:
qry_BankCustom ana kaynağınız, AS k ile ona kısa bir isim vermek pratiklik için, alanlara erişmek için k.ilgili alan yazmak kaynak tablo adını uzun uzun yazmaktan daha kolaydır. Buna göre qry_BankCustom içindeki her müşteri için bir satır döner. NZ alt sorgusu kısmında ise tbl_Sales tablosundan k.MusteriKod ile eşleşen kayıtlar için Tutar toplamını (SUM) alıyoruz çünkü WHERE s.MusteriKod = k.MusteriKod ana kaynağın k.MusteriKod değerine bağımlı. Buna korelasyonlu alt sorgu denir. Mantık olarak x müşterisi için tbl_Salesdeki toplam satış tutarı nedir sorusunu cevaplar.
Şayet Excele export etmek gibi işlemler uygulayacaksanız bu durumda NZ alt sorgularını
IIf(IsNull((SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod)), 0, (SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod)) AS ToplaTutar,
IIf(IsNull((SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod)), 0, (SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod)) AS NakitTahsilat
IFF yapısına dönüştürmek gerekir.

Sorgulara daha çok çalışmalısınız. Hala mantık hataları yapıyorsunuz, bu moralinizi bozmasın öğrenme aşamasında hata yapmak normaldir ve hata yapmak pratik olarak öğrenmenizi sağlar.
Dün, 12:19

truhi

(Dün, 10:32)atoykan yazdı:
SELECT k.ID,k.MusteriKod,k.MusteriAdi,k.Telefon,k.Giris,k.Cikis,k.Bakiye,
Nz((SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod),0) AS ToplaTutar,
Nz((SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod),0) AS NakitTahsilat
FROM qry_BankCustom AS k;
yapmak istediğiniz sorgu. Şöyle açıklayayım:
qry_BankCustom ana kaynağınız, AS k ile ona kısa bir isim vermek pratiklik için, alanlara erişmek için k.ilgili alan yazmak kaynak tablo adını uzun uzun yazmaktan daha kolaydır. Buna göre qry_BankCustom içindeki her müşteri için bir satır döner. NZ alt sorgusu kısmında ise tbl_Sales tablosundan k.MusteriKod ile eşleşen kayıtlar için Tutar toplamını (SUM) alıyoruz çünkü WHERE s.MusteriKod = k.MusteriKod ana kaynağın k.MusteriKod değerine bağımlı. Buna korelasyonlu alt sorgu denir. Mantık olarak x müşterisi için tbl_Salesdeki toplam satış tutarı nedir sorusunu cevaplar.
Şayet Excele export etmek gibi işlemler uygulayacaksanız bu durumda NZ alt sorgularını
IIf(IsNull((SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod)), 0, (SELECT SUM(s.Tutar) FROM tbl_Sales AS s WHERE s.MusteriKod = k.MusteriKod)) AS ToplaTutar,
IIf(IsNull((SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod)), 0, (SELECT SUM(c.Tutar) FROM tbl_CasheMoves AS c WHERE c.CariKod = k.MusteriKod)) AS NakitTahsilat
IFF yapısına dönüştürmek gerekir.

Sorgulara daha çok çalışmalısınız. Hala mantık hataları yapıyorsunuz, bu moralinizi bozmasın öğrenme aşamasında hata yapmak normaldir ve hata yapmak pratik olarak öğrenmenizi sağlar.

Çok teşekkür ederim.
iyi ki varsınız!!
sağ olun, var olun ...

(Dün, 09:33)onur_can yazdı: Sorgunuzun en sonunda bulunan NakitTahsilat: Tutar alanının Toplam satırını İlk olarak değiştirin.

Çok teşekkür ederim Onur Hocam.
iyi çalışmalar dilerim.