Sub query + left join mantığını kuramadım

Firebird ve Interbase 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ı
burakb44
Üye
Mesajlar: 131
Kayıt: 11 Mar 2005 03:13

Sub query + left join mantığını kuramadım

Mesaj gönderen burakb44 »

arkadaşlar merhaba,

iki tane tablom var

1. tablo
depo
id integer,
depokodu integer


2. tablo
stokdevir
depokodu integer,
stokkodu char(30),
islemtarihi date,
miktari integer


1. tabloda
1-Merkez Depo
2-A deposu
3- B deposu


2. tabloda
1-10.08.2011-stkd1-10
2-10.08.2011-stkd2-20
3-10.08.2011-stkd3-40
2-12.08.2011-stkd1-10
3-12.08.2011-stkd2-30
1-12.08.2011-stkd3-10

kısaca açıklayayım
1. tabloda depo kodlarını tutuyorum,
2. tablodada hangi üründen hangi depoda kaç tane var devir olarak giriyorum yani ilk satırda 1 nolu depoya 10.08.2011 tarihinde stkd1 stok kodlu üründen 10 tane devir yapıldı,

benim yapmak istediğim ise bu iki tabloyu kullanarak bi sorgu hazırlamak fakat bi türlü işin içinden çıkamadım yardımcı olursanız sevinirim.

stkd1 stok kodlu üründen hangi depoya kaç tane girilmişse bunların toplamını almak istiyorum yalnız her depoya bu stok kodu ile yapılan en son tarihteki giriş miktarlarını toplamasını istiyorum bu işlemi delphi içinden 8-10 satırlık kod ile çözmek çok kolay ancak ben bu işlemi programın değil veritabanının kendisi yapsın istiyorum
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: Sub query + left join mantığını kuramadım

Mesaj gönderen sabanakman »

burakb44 yazdı:1. tablo
depo
id integer,
depokodu integer


2. tablo
stokdevir
depokodu integer,
stokkodu char(30),
islemtarihi date,
miktari integer


1. tabloda
1-Merkez Depo
2-A deposu
3- B deposu


2. tabloda
1-10.08.2011-stkd1-10
2-10.08.2011-stkd2-20
3-10.08.2011-stkd3-40
2-12.08.2011-stkd1-10
3-12.08.2011-stkd2-30
1-12.08.2011-stkd3-10
Örnek kayıtlarınıza göre istediğiniz sonuç nedir?
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
burakb44
Üye
Mesajlar: 131
Kayıt: 11 Mar 2005 03:13

Re: Sub query + left join mantığını kuramadım

Mesaj gönderen burakb44 »

stkd1 için en son 12.08.2011 tarihinde 10 adet girilmiş , stkd1 için 10 değerini
stkd2 için en son 12.08.2011 tarihinde 30 adet girilmiş , stkd2 için 30 değerini getirmesini istiyorum

tabi sorguyu hazrılarken where kısmında hangi stok kodu için istersek o stok koduna ait değeri getirmesini istiyorum tamamını istemiyorum
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: Sub query + left join mantığını kuramadım

Mesaj gönderen sabanakman »

Verilen örnek, SiraNo gibisinden otomatik artan alanınız yokmuş gibi düşünerek hazırlanmış bir sorgudur.

Kod: Tümünü seç

select * from tablo2 as ana
right join (select depokodu, stokkodu, max(islemtarihi) from tablo2
--where stokkodu='stkd1' -->şartı sorguyu hızlandırır ama şart olmazsa tüm stoklar devreye girer
group by depokodu, stokkodu) as alt on ana.depokodu=alt.depokodu and ana.stokkodu=alt.stokkodu and ana.islemtarihi=alt.islemtarihi
where alt.stokkodu='stkd1' -->stok kodu şartı
Böyle bir durumda son gün yapılmış birden fazla hareket varsa bunlar aynen gelecektir. Eğer otomatik artan alanınız varsa ve bu alan adına SiraNo dersek sorgu

Kod: Tümünü seç

select * from tablo2
where SiraNo in
(select max(SiraNo) from tablo2 as ana
right join (select depokodu, stokkodu, max(islemtarihi) from tablo2
--where stokkodu='stkd1' -->şartı sorguyu hızlandırır ama şart olmazsa tüm stoklar devreye girer
group by depokodu, stokkodu) as alt on ana.depokodu=alt.depokodu and ana.stokkodu=alt.stokkodu and ana.islemtarihi=alt.islemtarihi
where alt.stokkodu='stkd1' -->stok kodu şartı
)
şeklinde olacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
burakb44
Üye
Mesajlar: 131
Kayıt: 11 Mar 2005 03:13

Re: Sub query + left join mantığını kuramadım

Mesaj gönderen burakb44 »

şaban hocam verdiğiniz sorguyu denemidim fakat hata verdi çalışmadı her iki tablodada otomatik artan id isimli bi alanım var

ben istediğim sorguyu ve sonucunu delphi tarafında aşağıdaki kodla yapıyorum, bu koda uygun sorgulama örneği verebilirmisiniz

Kod: Tümünü seç

Procedure Sorgula(s_kodu:string);
var
t_miktar:real;
Begin
  t_miktar := 0;
  Depo.Active := False;
  Depo.SelectSQL.Clear;
  Depo.SelectSQL.Add('Select * From Depo Order By Depo_Kodu');
  Depo.Active := True;
  Depo.First;
  while not Depo.Eof do
    begin
      s_devir.Active := false;
      s_devir.SQL.Clear;
      s_devir.SQL.Add('Select * from stok_devir where stok_kodu='''+s_kodu+''' and depo_kodu = '''+Datamodule5.Depo.FieldByName('depo_kodu').AsString+''' order by islem_tarihi ');
      s_devir.Active := true;
      s_devir.Last;
      if s_devir.RecordCount <> 0 then
        t_miktar := t_miktar + s_devir.FieldByName('miktari').AsFloat;
      Depo.Next;
    end;
      showmessage(stryap(t_miktar));
End;
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: Sub query + left join mantığını kuramadım

Mesaj gönderen sabanakman »

Başlık FireBirb'müş :oops: . SQL Server veri tabanını baz alarak vermiştim örneği :shock:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
burakb44
Üye
Mesajlar: 131
Kayıt: 11 Mar 2005 03:13

Re: Sub query + left join mantığını kuramadım

Mesaj gönderen burakb44 »

sabanakman yazdı:Başlık FireBirb'müş :oops: . SQL Server veri tabanını baz alarak vermiştim örneği :shock:

:) sağlık olsun hocam , yukarıda verdiğim kod istediğim sonucu veriyor eğer buna uygun bi sorgu yapabilirseniz sevinirim. kolay gelsin
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Re: Sub query + left join mantığını kuramadım

Mesaj gönderen Master43 »

Kod: Tümünü seç

select
  sum(alt2.miktari)
from DEPO ana
left join 
  ( select depokodu, max(islemtarihi) it from STOKDEVIR 
    group by depokodu )
                    alt1 on (ana.depokodu=alt1.depokodu)
left join STOKDEVIR alt2 on (alt1.depokodu=alt2.depokodu and alt1.it=alt2.islemtarihi)
where stokkodu='stkd1'
Cevapla