MySQL Join Birleştirme de Eksik Veri Geliyor..

Diğer 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ı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen hi_selamlar »

S.A.
Herkese saygılar...

MySQL ile JOIN işlemi yapmaya çalışıyorum. Fakat bilgiler eksik geliyor.

Şöyleki ;
MUSTERI ve SATISLAR
ADINDA 2 TABLOM VAR.

Musteri dosyasında 50 tane müşterim var. farklı farklı..
Amacım müşteri tablosu ile satış toplamlarını belirli tarihlerde birleşitirmek.
Ne yaptıysam olmadı.

müşteri 1 - 50 kg
müşteri 2 - 25 kg.
...
....
.....
sonuçta 50 adet müşteri listelemesi gerekirken bana 40 tane listeliyor.

Belirlenen tarihler arasında geriye kalan 10 müşterinin hareketi olmadığı için JOIN işlemi eksik dönüyor.

Bana 50 müşterinin boşta olsa kg toplamlarının gelmesi.
Lütfen bu konu için yardımlarınızı bekliyorum.

Teşekkür ederim.
Saygılar.


ÖRNEK;

Kod: Tümünü seç

SELECT 
  musteri.FIRMALAR_ID,
  musteri.KODU,
  musteri.UNVANI,
  SUM(SATIS.KG) AS KG,
FROM
  musteri
  left join SATIS ON (SATIS.FIRMALAR_ID = musteri.FIRMALAR_ID) and
                        (SATIS.MUSTERI_KODU= musteri.KODU)
WHERE
  SATIS.HESABA_DAHIL_EDILSIN_MI = 0 and
  SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30'
GROUP BY
  musteri.FIRMALAR_ID,
  musteri.KODU
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen vkamadan »

merhaba ,
LEFT JOIN ifadesini LEFT OUTER JOIN olarak değiştirmelisiniz, iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen hi_selamlar »

vkamadan yazdı:merhaba ,
LEFT JOIN ifadesini LEFT OUTER JOIN olarak değiştirmelisiniz, iyi çalışmalar.
sELECT
musteri.FIRMALAR_ID,
musteri.KODU,
musteri.UNVANI,
SUM(SATIS.MIKTAR) AS KG
FROM
musteri
left outer join SATIS ON (giris002.FIRMALAR_ID = musteri.FIRMALAR_ID) and
(SATIS.MUSTERI_KODU= musteri.KODU)
WHERE
SATIS.HESABA_DAHIL_EDILSIN_MI = 0 and
SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30'
GROUP BY
musteri.FIRMALAR_ID,
musteri.KODU
S.A. hocam,

öncelikle cevabınız için teşekkür ederim.

Ama maalesef yine 50 kayıt dönmedi.

Ben istediğim müşteri listesindeki 50 kaydın hareketi olsun vaya olmasın
50 kaydın mutlaka dönmesi gerekli.

İç içe select ile çözüyorum ama sorgu ağır çalışıyor. JOIN de işlemler çok hızlı.

Bilgi ve tecrübelerini paylaşırsanız tekrar sevinirim.

Saygılar..
Herkes cahildir, bazi konularda.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen emin_as »

Sanırım sorun aşagıda where den kaynaklanıyor, belirli satış şartları geçerli olsun istiyorsun, o yüzden eger bu alanlar boş olursa o kayıtları getirmeyecektir.

Kod: Tümünü seç

WHERE
  SATIS.HESABA_DAHIL_EDILSIN_MI = 0 and
  SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30'
Where bölümü üzerinde denemeler yap, oradan çözüme ulaşabilirsin.

örnegin:
where satis.tarih is null or satis.tarih between '20112-10-01' and '2012-10-30'
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen vkamadan »

Kod: Tümünü seç

WHERE
SATIS.HESABA_DAHIL_EDILSIN_MI = 0 and
SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30'

WHERE kısmına tanımladığınız bu kıstasları WHERE den çıkartın LEFT OUTER JOIN den sonra verdiğiniz kıstasların peşine koyun

Kod: Tümünü seç

sELECT
musteri.FIRMALAR_ID,
musteri.KODU,
musteri.UNVANI,
SUM(SATIS.MIKTAR) AS KG
FROM
musteri
left outer join SATIS ON (giris002.FIRMALAR_ID = musteri.FIRMALAR_ID) and
(SATIS.MUSTERI_KODU= musteri.KODU) and (SATIS.HESABA_DAHIL_EDILSIN_MI = 0) and (SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30')
GROUP BY
musteri.FIRMALAR_ID,
musteri.KODU
gibi..
çünkü WHERE kısmına yazacaklarınız mutlak suretle en son sonuç üzerinde filtreleme yapar, ama sizin LEFT OUTER ile ekledğiniz tablo boş olsa dahi ana tablonuz olan "musteri" deki select sonucu kadar sonuç her zaman dönecektir. özetle JOIN de ON belirtecinden sonra yazacağınız kıstaslar JOIN ile alınacak tablonun üzerinde etkilidir.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen hi_selamlar »

S.A.

Hocam vermiş olduğunuz bilgi için çok teşekkür ederim.

Kodu aşağıdaki şekilde yapınca 50 müşteri kaydı dönüyor ve boş ise de NULL yazıyor.

DÜZELTİLMİŞ KOD ;

Kod: Tümünü seç

sELECT
  musteri.FIRMALAR_ID,
  musteri.KODU,
  musteri.UNVANI,
  SUM(SATIS.MIKTAR) AS KG
FROM
  musteri
  left outer join SATIS ON (SATIS.FIRMALAR_ID = musteri.FIRMALAR_ID) and
                              (SATIS.MUSTERI_KODU= musteri.KODU) and
                              (SATIS.HESABA_DAHIL_EDILSIN_MI=0) and
                              (SATIS.TARIH BETWEEN '2012-10-01' AND '2012-10-30')

GROUP BY
  musteri.FIRMALAR_ID,
  musteri.KODU
Hocam çok teşekkür ederim. :bravo:

Saygılar..
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen vkamadan »

null istemeyip varsayılan bir değer iserseniz (örn: boş olanlarda 0 yazsın)

Kod: Tümünü seç

SUM(SATIS.MIKTAR) AS KG
kısmını

Kod: Tümünü seç

IFNULL(SUM(SATIS.MIKTAR),0) AS KG
şeklinde düzenleyebilirsiinz.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: MySQL Join Birleştirme de Eksik Veri Geliyor..

Mesaj gönderen hi_selamlar »

S.A.

Hocam paylaşımınız için çok teşekkür ederim.

Saygılar.
Herkes cahildir, bazi konularda.
Cevapla