Basit Bir Join işlemi Hakkında

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Basit Bir Join işlemi Hakkında

Mesaj gönderen F.Atagun »

Merhaba,
2 basit Tablo şu şekildedir.

CariHareketTablosu
EvrakNo------Tutar--TaksitVade
123----------100----10.10.08
123----------100----10.11.08
123----------100----10.12.08

Kargo Tablosu
KargoNo----EvrakNo---GonderilmeTarihi
55------------123---------09.10.08 // --> Evrak ilk gönderim tarihi
56------------123---------09.11.08 // --> Evrak 2. kez gönderilmiş. Bu daha fazla da olabilir


Şu ifadeye ulaşmaya çalışıyorum


EvrakNo------ToplamTutar--İLKTaksitVade----İLKGonderilmeTarihi----SonKargoNo
123----------------300---------------10.10.08------------------09.10.08-----------------56


Yukarıdaki Carihareket Tablosundaki 123Nolu Evrak aslında 300 YTL dir. Carihareket Tablosunda taksit taksit yazmaktadır.

Aşağıdaki SQL kodu ile Evrağın toplamını alıyorum ve kargo numarasını da yanına yazıyorum. Sorun yok.

Kod: Tümünü seç

SELECT CariHareket.EvrakNo, first(CariHareket.TaksitVade) ilkVade, Sum(CariHareket.Tutar) AS ToplamTutar, Last([_Kargo_Detay].KargoNo) as SONKARgoNo
FROM CariHareket LEFT JOIN _Kargo_Detay ON CariHareket.EvrakNo= [_Kargo_Detay].EvrakNo
GROUP BY CariHareket.EvrakNo, [_Kargo_Detay].KargoNo


Ancak evrak kargoya 2 veya daha fazla defa verildi ise ozaman Toplam tutar 300 YTL yi kargo dosyasındaki sayı ile çarpıyor 300 YTL yerine; 2 defa gönderildiyse 600 YTL, 3 defa gönderildiyse 900 YTL yazıyor

Acaba Join işlemindemi hata yapıyorum ? Nerede eksiğim vardır?

Not: Vt Access dir

Teşekkürler
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Basit Bir Join işlemi Hakkında

Mesaj gönderen sabanakman »

Access'e pek hakim değilim ama belli karmaşıklıktan sonrasını halledemeyebilir. Önerim kargo bilgilerini her belge için tek satır haline getirecek sorgu (view) oluşturman ve joinde bu sanal tabloyu kullanman.

Kod: Tümünü seç

SELECT CariHareket.EvrakNo, first(CariHareket.TaksitVade) ilkVade, Sum(CariHareket.Tutar) AS ToplamTutar, [KargoDetayi].KargoNo as SONKARgoNo
FROM CariHareket LEFT JOIN 
  (select Evrakno, Last(KargoNo) AS KargoNo _Kargo_Detay GROUP BY Evrakno) AS KargoDetayi
ON CariHareket.EvrakNo= [KargoDetayi].EvrakNo
GROUP BY CariHareket.EvrakNo, [KargoDetayi].KargoNo
gibi. Tabi sanal olarak oluşan bu KargoDetayi tablosunu verecek bir view belki işe yarayabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: Basit Bir Join işlemi Hakkında

Mesaj gönderen F.Atagun »

Teşekkürler ŞabanAkman Hocam

Henüz denemedim ama aşağıdaki gibi bir yapıda olmasını bir arkadaş tavsiye etti. Tam sonucu henüz bende bilmiyorum. Üzerinde biraz çalışacagım

Teşekkür ederim

Kod: Tümünü seç

SELECT ch.EvrakNo ,
Sum(ch.Tutar) AS ToplamTutar,
Min(ch.TaksitVade) ilkvade,
(select min(kd.GonderilmeTarihi) from _Kargo_Detay kd where kd.EvrakNo=ch.EvrakNo) ilkgonderilmetarihi,
(select max(kd.KargoNo) from _Kargo_Detay kd where kd.EvrakNo=ch.EvrakNo) sonKargoNo,
FROM CariHareket ch
GROUP BY ch1.EvrakNo
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: Basit Bir Join işlemi Hakkında

Mesaj gönderen F.Atagun »

Arkadaşlar şu şekilde çözüme ulaştım. :bravo:

Kodun sadeleştirilmiş hali aşağıdaki gibidir.

Kod: Tümünü seç

SELECT CariHareket.EvrakNo , Sum(CariHareket.Tutar) AS ToplamTutar,

 (SELECT min(EvrakNo ) AS İlkEN  FROM _Kargo_Detay where (CariHareket.EvrakNo = [_Kargo_Detay].EvrakNo ) ) AS IlkNo
FROM CariHareket 
GROUP BY CariHareket.EvrakNo 
Cevapla