Sql iç içe select döngüsü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Sql iç içe select döngüsü

Mesaj gönderen lom »

s.a kolay gelsin arkadaşlar. kasa adında bi tablom var. alanları şu şekilde:
KASA_ID
TARIH
TUTAR
TURU

ÖRNEK: aşağıdakiker kasa tablosunun içeriği
17.10.2008 --- 200 --- GIRIS
17.10.2008 --- 300 --- GIRIS
17.10.2008 --- 50 --- CIKIS
18.10.2008 --- 350 --- GIRIS
18.10.2008 --- 150 --- CIKIS
18.10.2008 --- 75 --- CIKIS
19.10.2008 --- 110 --- GIRIS
nasıl bir sorgu yazmalıyımki sonuç şu şekilde olsun :

TARIH--- GIRIS--- CIKIS--- KALAN
17.10.2008--- 500 --- 50--- 450
18.10.2008--- 350--- 225--- 125
19.10.2008--- 110--- 0--- 110

İç içe select ile yapmaya çalıştığım ama bayağı bi karıştırdım :) İyi çalışmalar.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Sql iç içe select döngüsü

Mesaj gönderen mkysoft »

Kod: Tümünü seç

select distinct tarih,(select sum(miktar) from kasa k2 where k2.tarih = k1.tarih and turu='GIRIS' group by k2.tarih) as giris,(select sum(miktar) from kasa k3 where k3.tarih = k1.tarih and turu='CIKIS' group by k3.tarih) as cikis, (giris-cikis) as kalan  from kasa k1 order by tarih
Bu şekilde yapabilirsin. Eğer indexlerin yoksa baya yavaş bir sorgu olacakır.
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Re: Sql iç içe select döngüsü

Mesaj gönderen lom »

hocam çok teşekkür ederim. verdiğiniz kodu aynen analyzer'e yapıştırdım. AS GIRIS - AS CIKIS bölümlerinde hata verdi.

Kod: Tümünü seç

ınvalid colum name GIRIS,CIKIS

Kod: Tümünü seç

select 
distinct TARIH,
GIRIS=(select sum(TUTAR) from KASA k2 where k2.TARIH = k1.TARIH and TURU='GIRIS' group by k2.TARIH),
CIKIS=(select sum(TUTAR) from KASA k3 where k3.TARIH = k1.TARIH and TURU='CIKIS' group by k3.TARIH)
from KASA k1 
order by TARIH
bu şekilde düzelttiğimde sorun yok ancak kalan tutarı gösteremiyorum ne yazıkki. acaba nedendir.

KALAN=GIRIS - CIKIS yapıyorum. yine aynı hataa. İyi Çalışmalar.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Sql iç içe select döngüsü

Mesaj gönderen conari »

Kod: Tümünü seç

select 
TARIH,
case when turu='GIRIS' THEN SUM(GIRIS) ELSE 0 END AS GIRIN,
case when turu='CIKIS' THEN SUM(CIKIS) ELSE 0 END AS CIKAN,
case when turu='GIRIS' THEN SUM(GIRIS) ELSE -SUM(CIKIS) END AS BAKIYE FROM KASA 
group by TARIH
order by TARIH
Yeterli olmalı ama syntax hatası olabilir denemedim.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Sql iç içe select döngüsü

Mesaj gönderen emin_as »

Bu sql sorgusunu sürekli çalıştıracaksan, bir stored procedure yaz, daha kullanısli olur..

Kullanmak için :
select * from kasahareket

Kod: Tümünü seç

create procedure kasahareket 
returns (
  tarih date,
  giris numeric (18,2),
  cikis numeric (18,2),
  kalan numeric (18,2)
) as
declare variable controltarih date;
declare variable temptarih date;
declare variable temptur varchar(10);
declare variable temptutar numeric(18,2);
begin
  giris=0;
  cikis =0 ;
  kalan = 0; 
  controltarih = null;
  for 
    select tarih, tur , sum(tutar ) from kasa_defteri 
    group by  1,2 
    order by 1
    into :tarih, :temp_tur, :temp_tutar
    do
    begin
       if   ( controltarih  is null ) then controltarih = tarih; 
       if   ( controltarih <> tarih ) then  suspend;
       controltarih = tarih;
       if   ( temp_tur = 'GIRIS' ) then  giris = giris + temp_tutar;
       if   ( temp_tur = 'CIKIS' ) then  cikis = cikis + temp_tutar;
       kalan = giris - cikis;
   end
end
Cevapla