3 tane tabloyu bağlayarak toplam alanı bulmak

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Erd_turkmen
Üye
Mesajlar: 38
Kayıt: 27 Ara 2006 03:13

3 tane tabloyu bağlayarak toplam alanı bulmak

Mesaj gönderen Erd_turkmen »

Herkese merhabalar. Arkadaşlar yaklaşık 1,5 saattir forumda arıyorum bu konu bayağı konuşulmuş ama gerçekten ben kendime uyarlayamadım :(
3 tane tablom var.. Paradox veritabanı

-müsteri tablosu
mno * ---------- 5
madi ---------- Ahmet
msoyadi----------Kara

-siparis tablosu
sno * ---------- 7
mno ---------- 5
aciklama ------- -
fiyat ---------- 500Ytl

-kasa tablosu
key * --------------2---- 2----2
musno ------------- 5---- 5----5
sipno ------------ 7---- 7----7
alinan_fiyat -------100-- 250--50


istediğim rapor sonucu :

Madi Msoyadi Fiyat alinan_miktar
Ahmet Kara 500 400


Aslında alanlarım dahada çok ama gerekli olanları yazdım. Raporlamak için 3 tablodan veri çekmem gerekiyor. Normalde 3 tane tabloyu birbirine bağlıyorum ancak kasa tablosundaki alinan_fiyat alanının toplamını almam gerekiyor (şartım siparis tablosundaki sno ile kasa tablosundaki sipno eşit olmalı). Aslında yapabileceğimi düşünüyodum ama forumuda okuyunca iyice kafam karıştı :?

Şöyle bi kod kullandım :

Kod: Tümünü seç

select  m.madi , m.msoyadi , s.aciklama,s.fiyat,k.alinan_fiyat  from musteri m , siparis s , kasa k
where  m.mno=s.mno and s.mno=k.musno
Biliyorum bu şekilde sadece 3 tane tablo bağlanılıyo. alanın toplamını bulmak için SUM kullanılıyo ancak bunun içinde Group by kullanılıyo. Group by 'ı beceremedim bir türlü kanımca :) Yardımlarınız için teşekkürler. Kolay Gelsin

@mrmarman yazdı:TAŞIMA BİLGİSİ : Programlama formundan DİĞER VERİTABANLARI formuna taşınmıştır
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Dediğin gibi toplama işlemi için SUM() fonksiyonunu kullanmalısın. Bu tür bir fonksiyon kullandığında diğer alanları GROUP BY da tanımlamalısın :idea:

Kod: Tümünü seç

select  m.madi , m.msoyadi , s.aciklama,s.fiyat, SUM(k.alinan_fiyat)  
from musteri m , siparis s , kasa k
where  m.mno=s.mno and s.mno=k.musno
GROUP BY m.madi , m.msoyadi , s.aciklama,s.fiyat
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Erd_turkmen
Üye
Mesajlar: 38
Kayıt: 27 Ara 2006 03:13

Mesaj gönderen Erd_turkmen »

rsimsek yazdı:Dediğin gibi toplama işlemi için SUM() fonksiyonunu kullanmalısın. Bu tür bir fonksiyon kullandığında diğer alanları GROUP BY da tanımlamalısın :idea:

Kod: Tümünü seç

select  m.madi , m.msoyadi , s.aciklama,s.fiyat, SUM(k.alinan_fiyat)  
from musteri m , siparis s , kasa k
where  m.mno=s.mno and s.mno=k.musno
GROUP BY m.madi , m.msoyadi , s.aciklama,s.fiyat
Hocam ilginize teşekkür ederim. Verdiğiniz kodu kullandım ancak
Field sipno notfound diye bir hata mesajı alıyorum. acaba sipariş tablosunda sipno alanı key olduğu için mi alıyorum bu hatayı. Nasıl olabilir ? Kolay gelsin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

select içinde sipno diye bir alan yok fakat kullanılan DataSet in field editörüne eklenmiş olabilir. Hangi ortamda hangi bileşenlerle çalıştığınızı belirtmemişsiniz :roll:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Erd_turkmen
Üye
Mesajlar: 38
Kayıt: 27 Ara 2006 03:13

Mesaj gönderen Erd_turkmen »

rsimsek yazdı:select içinde sipno diye bir alan yok fakat kullanılan DataSet in field editörüne eklenmiş olabilir. Hangi ortamda hangi bileşenlerle çalıştığınızı belirtmemişsiniz :roll:
Evet hocam aynen dediğiniz gibi field kısmına eklenmiş onu silince sorunum ortadan kalktı. Ancak şu anki sorunum daha farklı :( Kusura bakmayın :(
Şimdi normal group by ile istediğim alanları gruplayabiliyorum. Ancak kasa tablosundaki alınan_fiyat bölümünün toplam alanını buluyor fakat tüm kayıtların toplamını buluyor. Benim belirlediğim şarta bağlı olarak toplamını bulmuyor. Bu şartı aynı zamanda Having kullanarak yapmaya çalıştım ama Capability not supporting.... diye bir mesaj aldım. Having kullanmadan Kullandığım Kod :

Kod: Tümünü seç

procedure TForm1.suiButton1Click(Sender: TObject);
begin
query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select m.madi , m.msoyadi , s.aciklama,s.toplam , SUM(k.alinan_miktar) from musteri m , siparis s , kasa k');
Query1.SQL.Add('where  s.mno='''+b.Text+''' and s.sno='''+c.Text+''' GROUP BY m.madi , m.msoyadi , s.aciklama,s.toplam' );
Query1.Open;
end;
Bu şekilde herhangi bir hata yom ancak kasa tablosunun alınan_miktar kısmının tamamını topluyor.

Having kullanarak yazdığım kod :

Kod: Tümünü seç

procedure TForm1.suiButton1Click(Sender: TObject);
begin
query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select m.madi , m.msoyadi , s.aciklama,s.toplam , SUM(k.alinan_miktar) from musteri m , siparis s , kasa k');
Query1.SQL.Add('where  s.mno='''+b.Text+''' and s.sno='''+c.Text+''' GROUP BY m.madi , m.msoyadi , s.aciklama,s.toplam HAVING s.mno='''+b.Text+''' and s.sno='''+c.Text+'''' );
Query1.Open;
end;
Teşekkürler kolay Gelsin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

SUM ve GROUP BY ı kaldırıp bir dener misin?

Kod: Tümünü seç

select  m.madi , m.msoyadi , s.aciklama,s.fiyat, k.alinan_fiyat
from musteri m, siparis s, kasa k
where  s.mno = m.mno -- siparis i musteri ye bağladık.
  and k.musno = s.mno -- kasa yı siparis e bağladık.
ya da aşağıdaki gibi JOIN li şekilde de deneyebilirsin :wink:

Kod: Tümünü seç

select m.madi, m.msoyadi, s.aciklama, s.fiyat, SUM(k.alinan_fiyat) 
from musteri m
left join siparis s on (s.mno = m.mno)
left join kasa k on (k.musno = s.mno)
GROUP BY m.madi, m.msoyadi, s.aciklama, s.fiyat
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Erd_turkmen
Üye
Mesajlar: 38
Kayıt: 27 Ara 2006 03:13

Mesaj gönderen Erd_turkmen »

Hocam merhabalar. Verdiğiniz joinli uygulamayı denedim. İstediğim gibi belirlediğim alanın toplamıı veriyo. Ancak normalde tek bir kayıt göstermesi gerekirken musteri tablosundaki tüm kayıtları gösteriyo.
Örneğin;

Müşteri Tablosu :
10-Ahmet-Boran
11-Mehmet-Kara
Sipariş Tablosu
sno 5 - mno10 - toplam 500Ytl
Kasa Tablosu
sno 5 - mno 10- alinan_miktar 250
sno 5 - mno 10- alinan_miktar 150

Tablolarda bu şekilde kayıtlar var.

Kod: Tümünü seç

procedure TForm1.suiButton1Click(Sender: TObject);
begin
query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select m.madi, m.msoyadi, s.aciklama, s.toplam, SUM(k.alinan_miktar)from musteri m left join siparis s on (s.mno = '''+a.Text+''')left join kasa k on (k.musno = '''+b.Text+''') GROUP BY m.mno,m.madi, m.msoyadi, s.aciklama, s.toplam');
Query1.Open;
end;
Bu kodu kullanarak butona bastığımda sonuç olarak

Ahmet Boran 500 400
Mehmet Kara 500 400 sonuçları çıkıyor. Yani müşteri tablosunu filtrelemiyor.Normalde sadece musnosunu belirlediğim kişi gelmesi lazım. kusura bakmayın yüzüm kızarmaya başladı ama napayım uğraştım beceremedim :oops: Teşekkürler kolay gelsin
Cevapla