Sql

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
dost
Üye
Mesajlar: 104
Kayıt: 08 Oca 2004 11:33

Sql

Mesaj gönderen dost »

Kod: Tümünü seç

S_NO SICIL_NO TARIH SICIL_NOTU ORTALAMA
1	 100	 15.12.1992	90	   0
2	 100	 15.12.1993	90	   0
3	 100	 15.12.1994	90	   0
4	 100	 15.12.1995	90	   0
5	 100	 15.12.1996	90	   0
6	 100	 15.12.1997	90	   90
7	 100	 15.12.1998	90	   0
8	 100	 15.12.1999	90	   0
9	 100	 15.12.2000	90	   0
10	100	 15.12.2001	90	   0
11	100	 15.12.2002	90	   0
12	100	 15.12.2003	90	   90
13	101	 15.12.1992	90	   0
14	101	 15.12.1993	90	   0
15	101	 15.12.1994	90	   0
16	101	 15.12.1995	90	   0
17	101	 15.12.1996	90	   0
18	101	 15.12.1997	90	   90


procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT SICIL_NO, AVG(SICIL_NOTU) AS Sicil_Ortalama FROM MASTER');
  ADOQuery1.SQL.Add('WHERE 1=1');
  ADOQuery1.SQL.Add('GROUP BY SICIL_NO');
  ADOQuery1.SQL.Add('HAVING AVG(SICIL_NOTU) >= 90');
  ADOQuery1.SQL.Add('AND COUNT(*) = 6');
  ADOQuery1.SQL.Add('ORDER BY TARIH ASC');

  //ShowMessage(ADOQuery1.SQL.Text);
  ADOQuery1.Open;
end;
Yukarıdaki şekilde tarihe göre sıralı, sicil_no grup olarak 6 yılın ortalaması 90 olanları

dökecek sql kodunu çalıştıramadım. Yardımcı olabilirmisiniz? Teşekkürler.

Access veritabanı.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Hızlı cevap alabilmede forum kurallarına uymanın yaydasını mutlaka gorursunuz... Sorunuz bir sql sorusu oldugu icin programlama forumundan buraya taşıdım oncelikle....

ikincisi, soruyu kodu karışık gosteren delphi kodu ile birlikte değil de aşağıda olduğu gibi sadece sql cümlesi ile birlikte sormanız çok daha iyi olurdu...

Kod: Tümünü seç

SELECT SICIL_NO, AVG(SICIL_NOTU) AS Sicil_Ortalama 
FROM MASTER
WHERE 1=1
GROUP BY SICIL_NO
HAVING AVG(SICIL_NOTU) >= 90
AND COUNT(*) = 6
ORDER BY TARIH ASC
O zaman sorunun anlaşılma ihtimal ve cevap ihtimali çok artar....
Sorunuza gelince ;
WHERE 1=1 in bir anlamı olmamakla birlikte bir zarari da yok tabi...
Soruyu doğru anladıysam eğer ilk 6 yıldaki ortalama sicil notu 90 ve üzeri olanlari listelemek istiyorsunuz.... Tablonuzda zaten sanki bu ortalamayi tutan bir alan var gibi (ORTALAMA), Eger oyleyse kod basit tabi ki

Kod: Tümünü seç

Select distinct M.SICIL_NO
from MASTER M
where M.ORTALAMA>=90 and year(M.TARIH) - (Select Min(M1.TARIH) from MASTER M1 where M1.SICIL_NO=M.SICIL_NO)=5
Yok eğer bu alanın amacı ve içeriği farklı derseniz o zaman iş biraz karışır...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
dost
Üye
Mesajlar: 104
Kayıt: 08 Oca 2004 11:33

Mesaj gönderen dost »

Hocam ilginize teşekkür ederim.

Personelin yıllara göre sicil notu giriliyor,

Kod: Tümünü seç

SIRA_NO SICIL_NO SICIL_TARIH SICIL_NOTU SICIL_ORTALAMA
1-------100------15.12.1992--70---------0
2-------100------15.12.1993--90---------0
3-------100------15.12.1994--80---------0
4-------100------15.12.1995--90---------0
5-------100------15.12.1996--100--------0
6-------100------15.12.1997--90---------0
7-------100------15.12.1998--90---------0
8-------100------15.12.1999--80---------0
9-------100------15.12.2000--90---------0
10------100------15.12.2001--70---------0
11------100------15.12.2002--90---------0
12------100------15.12.2003--80---------0
sorguladığımda;

ilgili personel sicil nosuna göre gruplanarak,birinci tarihten başlayarak eğer 6 yılın sicil notu
ortalaması 90 ve üzeri ise, sicil_ortalama alanında gösterecek;

yani,birinci tarihten başlayarak ilk 6 yılın 90 ve üzeri ise ve devam ederek ikinci,üçüncü,dördüncü
6 yılın sicil notu ortalaması 90 ve üzeri ise gösterecek SQL kodunu yazamadım.

Kod: Tümünü seç

Select M1.SICIL_NO,
  (Select Avg(M2.SICIL_NOTU) From Master M2 Where M2.SICIL_NO=M1.SICIL_NO) AS ORTALAMA,
  Count(*) AS TOPLAM
  From Master M1
  Group By M1.SICIL_NO
  Order By M1.SICIL_NO Asc
SQL koduna yardımcı olabilirmisiniz?
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Mesaj gönderen ng »

Öncelikle hangi veritabanını kullanıyorsunuz?
Sonra ikinci,üçüncü 6. yıl derken ne demek istiyorsunuz mesela 10 kayıt varsa ilk önce 1..6 arasındaki kayıtların ortalamasını alacak eğer 90 ve üstü ise 2..7 kayıtların ortalamasını alacak ve eğer 90 ve üstü is işlem bulunduğumuz yıla kadar devam edecek öyle mi?
dost
Üye
Mesajlar: 104
Kayıt: 08 Oca 2004 11:33

Mesaj gönderen dost »

Access veritabanı,

birinci tarihten başlayarak 6 yılın ortalamasını alacak 90 ve üzeri ise gösterecek ve doksandan sonraki
6 yılın ortalamasını alarak 90 ve üzeri ise gösterecek, yani sicil_nosuna göre ilk tarihten son tarihe
kadar 6 yıllık dilimler halinde doksan ve üzerini gösterecek,

birçok sql kodu denememe rağmen çalıştıramadım.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

%100 olmaz demiyorum ama bu şartlar altında bu işi sql ile yapamazsınız gibime geliyor... Şartlardan kastettiğim ise Access kullanıyor olmanızdır... Zira aklıma bir takım ipuçşarı geliyor ama bunları Access'in çalıştırma ihtimlali yok.... Muhtemel bir stored procedure kullanımı olacak belki ama o da yok.....

Velhasıl bu şartlar altında sql'i zorlamak gereksiz... Zira sizdeki problem sql ile yapılması zaten oldukça zor problem.... Eğer Sybase, Oracle gibi donanımlı bir veritabanı olsa hallolurdu ama......

En pratik cozum Delphi tarafında kurulacak bir dongu ve yapılacak kontrollerle işi halletmek olacak....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
dost
Üye
Mesajlar: 104
Kayıt: 08 Oca 2004 11:33

Mesaj gönderen dost »

Hocam ilginize çok teşekkür ederim. Bildiğim tüm sql kodunu denedim
ama çalıştıramadım.
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Mesaj gönderen ng »

İşin içine döngüler girdiği için sadece sql ile zor ama access de makrolar kısmında kodlar la bu işi halledebilirsiniz belki.
Cevapla