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
sql kodları
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Re: sql kodları
1. ay yetmez yıl da olmalı. (o yıl ve ayın ilk gününden son gününe..)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
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
http://www.firebirdsql.org
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
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.
...
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
http://www.firebirdsql.org
Ö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.
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.
s.a.
Programı verdiği hatayı tahmin etmemizi beklemiyorsan eger verdiği hata mesajınıda yazarsan yardımcı olmak isteyen arkadaşların (benim gibi
) işini kolaylaştırmış olursun. Aksi halde şimdi uğraşamam deyip sorunu es geçebilirler...
..
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.
şeklinde olursa sanırım çalışır....
tekrar hatırlatıyorum programın verdiği hata mesajını lütfen yazınız.
ama aşağıda verdiği hatayı biz göremiyoruz.zaxacm yazdı:Aşağıdaki gibi kodları ayarladım.Ama "count" ile ilgili bir hata veriyor.



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');
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
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.
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
http://www.firebirdsql.org
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
Emailim:zaxacam@yahoo.com
Formu indireceğiniz link:
http://rapidshare.de/files/11862376/Kut ... p.rar.html
user_name=SYSDBA
password=2410