none
3 tablodan (müşteri,satışlar,ödeme) borçlular sorgusu yapma RRS feed

  • 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.ceptel
    FROM            TblSatislar INNER JOIN
                             TblOdeme ON TblSatislar.mid = TblOdeme.mid INNER JOIN
                             TblMusteriler ON TblSatislar.mid = TblMusteriler.id
    GROUP BY TblSatislar.mid, TblMusteriler.firma, TblMusteriler.yetkiliad, TblMusteriler.yetkilisoyad, TblMusteriler.tc, TblMusteriler.istel, TblMusteriler.ceptel

    26 Ocak 2016 Salı 14:32

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;


    26 Ocak 2016 Salı 16: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;


    26 Ocak 2016 Salı 16:58
  • Öncelikle ilginiz ve cevabınız için çok teşekkürler.

    Yalnız hatalı galiba çünkü; satış ve ödeme tablosunda hiç  bulunmayan 2 adet kayıtta ekstradan listeleniyor.


    26 Ocak 2016 Salı 22:22
  • 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.

    27 Ocak 2016 Çarşamba 09:30
  • 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....

    30 Ocak 2016 Cumartesi 11:28
  • 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 + "%' ";
                 
                }

    30 Ocak 2016 Cumartesi 17:27
  • Hayir, ASLA ve ASLA oyle kod yazma, parametre kullan.

    31 Ocak 2016 Pazar 22:44