En iyi yanıtlayıcılar
3 tablodan (müşteri,satışlar,ödeme) borçlular sorgusu yapma

Soru
-
Herkese iyi çalışmalar
Sorum şu Müşteriler,Satışlar ve Ödemeler diye 3 tablom var.Yapmak istediğim borçlu listesi çıkarmak yani;(satışlardaki müşterinin "kdvli" sütununu toplamı) - (eksi) (ödemeler tablosundaki "ödeme" sütununun toplamı)Zaten ekteki reme bakınca anlayacaksınız.Ben aşağıdaki kodla buna benzer bir şey yaptım ama şöyle bir kusuru var.Satışlar tablosunda müşterinin satışı var ama ödeme tablosunda ödemesi olduğu için onu borçlu göstermiyor.SELECT TblSatislar.mid, SUM(DISTINCT TblSatislar.tutar) AS ToplamAlışveriş, SUM(DISTINCT TblOdeme.odeme) AS ToplamÖdeme, TblMusteriler.firma,TblMusteriler.yetkiliad, TblMusteriler.yetkilisoyad, TblMusteriler.tc, TblMusteriler.istel, TblMusteriler.ceptelFROM TblSatislar INNER JOINTblOdeme ON TblSatislar.mid = TblOdeme.mid INNER JOINTblMusteriler ON TblSatislar.mid = TblMusteriler.idGROUP BY TblSatislar.mid, TblMusteriler.firma, TblMusteriler.yetkiliad, TblMusteriler.yetkilisoyad, TblMusteriler.tc, TblMusteriler.istel, TblMusteriler.ceptel
Yanıtlar
-
Bu SQL'de cok daha buyuk bir hata var, iyi ki calismamis.
Eger iki tablo arasinda coka-cok iliski var ise, ASLA o tablolari join ile birlestirip SUM() kullanmayin, sonuc hatali cikacaktir. Burada sansiniza cikan baska bir durum (inner join nedeniyle) sizi farketmesi guc ve cok daha buyuk bir hatadan kurtarmis. Toplamlarinizi ayri ayri alip birlestirin:
WITH satislar ( mid, ToplamSatis ) AS ( SELECT mid, SUM(tutar) FROM TblSatislar GROUP BY mid ), odemeler ( mid, ToplamOdeme ) AS ( SELECT mid, SUM(odeme) FROM TblOdeme GROUP BY mid ) SELECT mus.*, [s].ToplamSatis, o.ToplamOdeme, COALESCE([s].ToplamSatis, 0) - COALESCE(o.ToplamOdeme, 0) AS Borc FROM TblMusteriler mus LEFT JOIN satislar s ON s.mid = mus.id LEFT JOIN odemeler o ON o.mid = mus.id;
- Düzenleyen CetinBasoz 26 Ocak 2016 Salı 16:59
- Yanıt Olarak Öneren Serkan Canseven 30 Ocak 2016 Cumartesi 11:51
- Yanıt Olarak İşaretleyen AysaYazılım 2 Şubat 2016 Salı 09:58
Tüm Yanıtlar
-
Bu SQL'de cok daha buyuk bir hata var, iyi ki calismamis.
Eger iki tablo arasinda coka-cok iliski var ise, ASLA o tablolari join ile birlestirip SUM() kullanmayin, sonuc hatali cikacaktir. Burada sansiniza cikan baska bir durum (inner join nedeniyle) sizi farketmesi guc ve cok daha buyuk bir hatadan kurtarmis. Toplamlarinizi ayri ayri alip birlestirin:
WITH satislar ( mid, ToplamSatis ) AS ( SELECT mid, SUM(tutar) FROM TblSatislar GROUP BY mid ), odemeler ( mid, ToplamOdeme ) AS ( SELECT mid, SUM(odeme) FROM TblOdeme GROUP BY mid ) SELECT mus.*, [s].ToplamSatis, o.ToplamOdeme, COALESCE([s].ToplamSatis, 0) - COALESCE(o.ToplamOdeme, 0) AS Borc FROM TblMusteriler mus LEFT JOIN satislar s ON s.mid = mus.id LEFT JOIN odemeler o ON o.mid = mus.id;
- Düzenleyen CetinBasoz 26 Ocak 2016 Salı 16:59
- Yanıt Olarak Öneren Serkan Canseven 30 Ocak 2016 Cumartesi 11:51
- Yanıt Olarak İşaretleyen AysaYazılım 2 Şubat 2016 Salı 09:58
-
-
-
Hayir hata yok. Yapmasini istedigimiz satis ve/veya odemesi olsun olmasin tum musteri kayitlarini getirmesi. Eger hic satis veya odemesi olmayanlari istemiyorsan where ile filtreleyebilirsin.
... where s.mid is not null or o.mid is not null
gibi.
Daha yeni bakabildim evet dediğiniz gibi doğruymuş.
Elinize beyninize yüreğinize sağlık....
-
Hayir hata yok. Yapmasini istedigimiz satis ve/veya odemesi olsun olmasin tum musteri kayitlarini getirmesi. Eger hic satis veya odemesi olmayanlari istemiyorsan where ile filtreleyebilirsin.
... where s.mid is not null or o.mid is not null
gibi.
Hocam affınıza ve sabrınıza sığınarak son bir sorum olacak;
Bir textbox ve bir combobox ile firmaadı ,yetkiliadı, yetkili soyadı, alanında arama yapmak için ;
Sizin koda şöyle bir ek yaptım.ama çalışmadı.
AND mus.firma like '%" + textBox1.Text + "%'
tamamı şöyle;
if (comboBox1.Text == "Firma adına göre")
{
sorgu = "WITH satislar(mid, ToplamSatis) AS (SELECT mid, SUM(tutar) AS Expr1 FROM Tbl_Satislar GROUP BY mid), odemeler(mid, ToplamOdeme) AS (SELECT mid, SUM(odeme) AS Expr1 FROM Tbl_Odeme GROUP BY mid) SELECT mus.firma, mus.yetkiliad, mus.yetkilisoyad, mus.tc, mus.istel, mus.ceptel, s.ToplamSatis, o.ToplamOdeme, COALESCE(s.ToplamSatis, 0) -COALESCE (o.ToplamOdeme, 0) AS KALAN FROM Tbl_Musteriler AS mus LEFT OUTER JOIN satislar AS s ON s.mid = mus.id LEFT OUTER JOIN odemeler AS o ON o.mid = mus.id WHERE s.mid is not null or o.mid is not null AND mus.firma like '%" + textBox1.Text + "%' ";
} -