sql kodları

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
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

sql kodları

Mesaj gönderen zaxacm »

Merhaba
delphi7 ve firebird kullanıyorum.

OID(öğrenci_id),
TARİH1(kitapAlışTarihi),
TARİH2(iadetarihi) şeklinde alanlarım var.

öğrencinin idsini, kitap aldığı tarihi ve iade ettiği tarihi kaydediyorum.
Buraya bakarak aşağıdaki 2 sql koduna ihtiyacım var, nasıl yazabilirim:

1-OID sütununa bakarak(OID si en çok tekrar edenlerden) ençok kitap okuyan öğrnciyi(hatta ilk 3 öğrenciyi) bulmak.Ancak bunu aya göre yapmak istiyorum.Comboboxtan seçtiğim aya göre ilk3 ü bulacak.

2-Yine comboboxtan seçtiğm gün sayısına göre iade gününü geçenleri görmek istiyorum.Şöyle olacak tarih2 ye bakacak, tarih2 si boş olanlardan ; (bugünün tarihi-tarih1) > combobox olanları listelemek istiyorum. Yardım ederseniz çok sevinirim
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Re: sql kodları

Mesaj gönderen Terminator »

zaxacm yazdı:Merhaba
delphi7 ve firebird kullanıyorum.

OID(öğrenci_id),
TARİH1(kitapAlışTarihi),
TARİH2(iadetarihi) şeklinde alanlarım var.

öğrencinin idsini, kitap aldığı tarihi ve iade ettiği tarihi kaydediyorum.
Buraya bakarak aşağıdaki 2 sql koduna ihtiyacım var, nasıl yazabilirim:

1-OID sütununa bakarak(OID si en çok tekrar edenlerden) ençok kitap okuyan öğrnciyi(hatta ilk 3 öğrenciyi) bulmak.Ancak bunu aya göre yapmak istiyorum.Comboboxtan seçtiğim aya göre ilk3 ü bulacak.

2-Yine comboboxtan seçtiğm gün sayısına göre iade gününü geçenleri görmek istiyorum.Şöyle olacak tarih2 ye bakacak, tarih2 si boş olanlardan ; (bugünün tarihi-tarih1) > combobox olanları listelemek istiyorum. Yardım ederseniz çok sevinirim
1. ay yetmez yıl da olmalı. (o yıl ve ayın ilk gününden son gününe..)
mesela, ocak ayında alınan kitaplar için 2006-01-01 ile 2006-01-31 gibi.

select OID,count(*) from odunc
where tarih1 between :tar1 and :tar2
group by OID
having count(*)>1 -- bir kitap okuduysa ödül alamasın keçi! ;)

orderlama işini sana bırakıyorum kendini geliştirmen için.
ilk üçü için ise, ters sıralatıp FIRST 3 diyebilirsin.

select * from odunc
where tarih2 is null
and (tarih1-current_date)>:limit
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

pardon,

...
and tarih1< current_date-:limit

indexden yararlanabileceği için bu daha hızlı çalışır. bu sorguda çok fazla
faydası olmayabilir ama, yine de dikkatli kullanmak lazım.

tarih1,OID
tarih2,OID

şeklinde indexlemeleri unutma sakın.
ama günlük verilen ve alınan kitap birkaçyüzü geçmiyorsa sadece
tarihlere göre de indexleyebilirsin.
Firebird Foundation Member #208
http://www.firebirdsql.org
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

Mesaj gönderen zaxacm »

Öncelikle cevabınız için çok teşekürler.
Aşağıdaki gibi kodları ayarladım.Ama "count" ile ilgili bir hata veriyor.

procedure Tfrmistatistik.BitBtn2Click(Sender: TObject);
begin
IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add('select OID count(*)from verilenler');
IBQuery2.SQL.Add('where TARIH between :tar1 and :tar2 group by OID having count(*)>1');
IBQuery2.ParamByName('tar1').AsDate:=strtodate(Maskedit1.Text);
IBQuery2.ParamByName('tar2').AsDate:=strtodate(Maskedit2.Text);
IBQuery2.Open;
IBQuery2.Last;
dbgrid1.Visible:=false;
dbgrid1.DataSource:=datasource2;
dbgrid1.Visible:=true;
end;

end.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
zaxacm yazdı:Aşağıdaki gibi kodları ayarladım.Ama "count" ile ilgili bir hata veriyor.
ama aşağıda verdiği hatayı biz göremiyoruz. :kup: Programı verdiği hatayı tahmin etmemizi beklemiyorsan eger verdiği hata mesajınıda yazarsan yardımcı olmak isteyen arkadaşların (benim gibi :D ) işini kolaylaştırmış olursun. Aksi halde şimdi uğraşamam deyip sorunu es geçebilirler... :alsana: ..
Bir diğer nokta kodlarını code /code tagları içine alırsan daha okunaklı olur.
kodlarına şöyle bir bakınca OID ile count arasına ","koymamışsın gibime geldi.

Kod: Tümünü seç

IBQuery2.SQL.Add('select count(*), OID from verilenler');
şeklinde olursa sanırım çalışır....
tekrar hatırlatıyorum programın verdiği hata mesajını lütfen yazınız.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »


-- bir kitap okuduysa ödül alamasın keçi!
Koptugum andır :lol: :lol: :lol:
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Sanırım SQL bilgin çok yetersiz, biraz daha yardımcı olayım:

select
OID,
(select adi || ' ' || soyadi from ogrenci where id=verilenler.oid) as ADI,
count(*) as OKUDUGU_KITAP_SAYISI
from verilenler
where tarih1 between :tar1 and :tar2
group by OID
having count(*)>1
order by 3 desc

Bu şekilde sana kayıtlar, en çok kitap okuyandan itibaren gelir ve
LAST çekmene gerek kalmadan, next next ile ilk 3 e girenleri seçebilirsin,
aynı sayıda kitap okuyanlar olabileceğini unutma.

Bir querye veya tabloya last çektiğiniz zaman bütün kayıtlar DB den fetch edilir ve bu pek mantıklı bir kullanım tarzı değil.
Firebird Foundation Member #208
http://www.firebirdsql.org
zaxacm
Üye
Mesajlar: 129
Kayıt: 05 Ara 2005 05:48

Mesaj gönderen zaxacm »

Bir türlü yapamadım eğer ekteki form üzerinde gösterebilirseniz minnettar kalırım.
Emailim:zaxacam@yahoo.com

Formu indireceğiniz link:
http://rapidshare.de/files/11862376/Kut ... p.rar.html

user_name=SYSDBA
password=2410
Cevapla