none
Gruop by Tutarların Fazla göstermesi RRS feed

  • Soru

  • Merhaba ,

    Kesinti ve Avans  bölümündeki değerleri cagırdıgımda fazla tutar veriyor.

    Mükerrer geliyor.

    ÜNVAN	AVANS	KESİNTİ
    ABC	17.00	258.74
    ABC	85.00	258.74
    ABC	789.00	258.74
    ABC	179.24	258.74
    ABC	17.00	114.85
    ABC	85.00	114.85
    ABC	789.00	114.85
    ABC	179.24	114.85


    • Düzenleyen Ömer_ 14 Ağustos 2016 Pazar 09:45
    14 Ağustos 2016 Pazar 09:29

Yanıtlar

Tüm Yanıtlar

  • Merhabalar,

    Tahminimce birinci tablonuzdaki bulunan bir firma_id ikinci tablonuzda birden fazla kez tekrar ediyor. Ya da aynı şekilde ikinci tabloda bulunan firma_id birinci tabloda tekrar ediyor. Bu durumda join şartınızda her bir id için eşleşme yapacağında data çoklanacaktır. Aşağıdaki şekilde group by işlemini subquery ler ile yapıp daha sonra join işlemini yapmayı dener misiniz?

    select *
    from
    (
    select firmaid, SUM(tutar)
    from avans
    group by firmaid
    ) as a
    inner join
    (
    select firmaid, SUM(tutar)
    from kesinti
    ) as k
    on a.firmaid = k.firmaid

    Aşağıdaki linklerden de faydalanabilirsiniz:

    http://stackoverflow.com/questions/11364162/mysql-join-and-sum-is-doubling-result

    http://stackoverflow.com/questions/5573424/sql-left-join-doubling-value-of-summed-columns

    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    • Yanıt Olarak Öneren CetinBasoz 14 Ağustos 2016 Pazar 20:18
    • Yanıt Olarak İşaretleyen Ekrem Önsoy 13 Ocak 2017 Cuma 08:19
    14 Ağustos 2016 Pazar 11:47
  • Bu forumda defalarca, join var ise aggregate kullanmayin diye uyarildi. Tipik join hatasi, ayni veri N kere toplama giriyor. Sen liste olarak degerleri vermeseydin de, sonuclara bakarak ABC'ye 4 kere avans verilip 2 kere kesinti yapildigi soylenebilirdi. Sen join ile bunlari baglayip toplayinca avans 2 kat, kesinti 4 kat oluyor. Dogrusu toplama islemlerini ayri ayri yapman (kullandigin SQL'leri kod olarak vermek varken neden resim olarak verdin ki - koduna bakinca SQL server olama olasiligi cok yuksek, onun icin SQL server kodu ile):

    with avansToplam (unvan, avans) as
    (
       select unvan, sum(tutar)
       from tblAvans 
       group by unvan
    ),
    kesintiToplam as (unvan, kesinti) as
    (
       select unvan, sum(tutar)
       from tblKesintiicmal 
       group by unvan
    )
    select at.Unvan, avans, kesinti
    from avansToplam at
    inner join kesintiToplam kt on at.unvan = kt.unvan;
    

    • Yanıt Olarak Öneren A_BLR 14 Ağustos 2016 Pazar 20:50
    14 Ağustos 2016 Pazar 20:30