alanları guruplayarak toplama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

KAYIT_TARIHI

alanınız grup kriteri olarak verilmemiş. Bu nedenle daha where / having e kadar gidemiyorsunuz. Ya bir aggregate fonksiyonla kullanmalı ya da group by a eklemelisiniz.


WHERE/HAVING kullanımı ile ilgili olarak da;

Kod: Tümünü seç

select alan_adi, count(*) from tablo
group by alan_adi
having count(*) > 5
burada da count(*) group by da verilen bir alan değil. Tüm kayıtlarda arıyorsunuz. Diyelim ki alan_adi 'De' ile başlayanlardan sayısı 5 i aşanların listesi gerekiyor. Bu durumda;

Kod: Tümünü seç

select alan_adi, count(alan_adi) from tablo
where alan_adi like 'De%'
group by alan_adi
having count(alan_adi) > 5
şeklinde kullanırız. Ya da il_kodu diye birşey var ve "o ildeki olay sayisi 3 le 5 arasi olanlar" gibi bir kriterde count(olay_sayisi) having e, il kodu ise where e parametre verilir.

Daha akılda kalıcı olması için;

"HAVING aggregate fonksiyonları kullanılarak oluşan alanların filtrelenmesinde kullanılır" ifadesi sanırım yanlış olmayacaktır.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Eğer kayıt tarihini görmek istiyorsan select de yazdığın kayıt_tarihi alanın dursun ama ozaman group by da eklemen lazım:

Kod: Tümünü seç

..
Sql.Add('GROUP BY HASTALIK_TURU,KAYIT_TARIHI');
Sql.Add('HAVING KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis') 
Yok eğer kayıt tarihini sorgu sonucunda görmeyeceksen select de kayıt_tarihini kaldır ozamna group by da da yazmana gerek yok. Bu durumda WHERE ile sorgulamalısın!

Kod: Tümünü seç

..
Sql.Add('WHERE KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis') 
Sql.Add('GROUP BY HASTALIK_TURU');
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

with DataHASTALIK.IsratistikRaporQry do
begin
Close;
SQL.Clear;
Sql.Add('SELECT HASTALIK_TURU,KAYIT_TARIHI,SUM(BIR_ONIKI_AY_ERKEK),'SUM(BIR_ONIKI_AY_KADIN)'+
'SUM(BIR_YAS_ERKEK),'+'SUM(BIR_YAS_KADIN),'+
'SUM(IKI_YAS_ERKEK),SUM(IKI_YAS_KADIN)'+
'SUM(UC_YAS_ERKEK),SUM(UC_YAS_KADIN),SUM(DORT_YAS_ERKEK),SUM(DORT_YAS_KADIN),'+
'SUM(BES_YAS_ERKEK),SUM(BES_YAS_KADIN),SUM(ALTI_YAS_ERKEK),SUM(ALTI_YAS_KADIN),'+
'SUM(YEDI_ONDORT_YAS_ERKEK),SUM(YEDI_ONDORT_YAS_KADIN),'+
'SUM(ONBES_YIRMIDORT_YAS_ERKEK),SUM(ONBES_YIRMIDORT_YAS_KADIN),'+
'SUM(YIRMIBES_OTUZDORT_YAS_ERKEK),SUM(YIRMIBES_OTUZDORT_YAS_KADIN),'+
'SUM(OTUZBES_KIRKDOKUZ_YAS_ERKEK),SUM(OTUZBES_KIRKDOKUZ_YAS_KADIN),'+
'SUM(ELLI_ELLIDOKUZ_YAS_ERKEK),SUM(ELLI_ELLIDOKUZ_YAS_KADIN),'+
'SUM(ALTMIS_ALTMISDORT_YAS_ERKEK),SUM(ALTMIS_ALTMISDORT_YAS_KADIN),'+
'SUM(ALTMISBES_USTU_ERKEK),SUM(ALTMISBES_USTU_KADIN)'+
'FROM hastalık_istatistik ');
Sql.Add('GROUP BY HASTALIK_TURU');
Sql.Add('HAVING KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis')
ParamByName('baslangic).AsDate := MonthCalender1.Date;
ParamByName('bitis).AsDate := MonthCalender2.Date;
Perepare;
Open;
end;

Yazdığım kod tamamen bu fakat çalıştırdığımda sorguyu
Operation not applicable hatası veriyor
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

arkadaşlar bütün dediklerinizi yaptım naile hocam son yazdıklarınıda yaptım sanki sorun başka sanırım devamlı aynı hatayı veriyor.
Operation not applicable hatası veriyor
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

http://bugs.mysql.com/bug.php?id=18084

Kod: Tümünü seç

Hi there,

It is a problem caused by what Mysql wants in the mean of Date format. And if
your regional settings and Mysql wants not match you have that error message.
For example MYsql wants 'yyyy-mm-dd' and your regional setting is 'mm-dd-yyyy'
u got this error. 

Solution:

procedure TForm1.Button1Click(Sender: TObject);
var
Fd     : TFormatSettings;//date format
begin

    GetLocaleFormatSettings(GetThreadLocale,Fd);
    Fd.ShortDateFormat := 'yyyy-mm-dd';
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('Select * from instant');
    query1.SQL.Add('where tarih > '+
QuotedStr(DateToStr(datetimepicker1.Date,Fd)));
    query1.Open;
end;

that is all.
Sizde tarih kısmını eklerken delphiden bu yöntemle eklemişsiniz
ParamByName('baslangic).AsDate := MonthCalender1.Date;
ParamByName('bitis).AsDate := MonthCalender2.Date;
Tarih alanını yukarda önerilen şekilde ekleyin ya da delphide uygun bir şekilde string olarak biçimlendirip değişkeni direkt elle girin.

Çözümleri kolaylaştırmak açısından sql ile ilgili bir durumda önce kodunuzu mysql query browser gibi db üzerinde direkt işlem yapan bir araçla çalıştırıp ardından programınıza eklemekte fayda var.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bak, eğer gruplama yapıyorsan select de yazdığın fieldları group by a da yazman lazım (aggregate fonksiyonları kullandıkların hariç, yani sum gibi) GROUP BY da HASTALIK_TURU nün yanına KAYIT_TARIHI ni de yaz demişim ama yazmamışsın ki :?:

Bence sqlle ilgili basit bir döküman bulup temel konulara bakmanı tavsiye ederim. (gruplamalar v.b.)
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

(aggregate fonksiyonları kullandıkların hariç, yani sum gibi) GROUP BY da HASTALIK_TURU nün yanına KAYIT_TARIHI ni de yaz demişim ama yazmamışsın ki
MySQL bu durumda hata vermiyor, hatta garip bir şekilde sonucu da döndürür.
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

Kod: Tümünü seç

with DataHASTALIK.IsratistikRaporQry do 
begin 
Close; 
SQL.Clear; 
Sql.Add('SELECT HASTALIK_TURU,KAYIT_TARIHI,SUM(BIR_ONIKI_AY_ERKEK),'SUM(BIR_ONIKI_AY_KADIN)'+ 
'SUM(BIR_YAS_ERKEK),'+'SUM(BIR_YAS_KADIN),'+ 
'SUM(IKI_YAS_ERKEK),SUM(IKI_YAS_KADIN)'+ 
'SUM(UC_YAS_ERKEK),SUM(UC_YAS_KADIN),SUM(DORT_YAS_ERKEK),SUM(DORT_YAS_KADIN),'+ 
'SUM(BES_YAS_ERKEK),SUM(BES_YAS_KADIN),SUM(ALTI_YAS_ERKEK),SUM(ALTI_YAS_KADIN),'+ 
'SUM(YEDI_ONDORT_YAS_ERKEK),SUM(YEDI_ONDORT_YAS_KADIN),'+ 
'SUM(ONBES_YIRMIDORT_YAS_ERKEK),SUM(ONBES_YIRMIDORT_YAS_KADIN),'+ 
'SUM(YIRMIBES_OTUZDORT_YAS_ERKEK),SUM(YIRMIBES_OTUZDORT_YAS_KADIN),'+ 
'SUM(OTUZBES_KIRKDOKUZ_YAS_ERKEK),SUM(OTUZBES_KIRKDOKUZ_YAS_KADIN),'+ 
'SUM(ELLI_ELLIDOKUZ_YAS_ERKEK),SUM(ELLI_ELLIDOKUZ_YAS_KADIN),'+ 
'SUM(ALTMIS_ALTMISDORT_YAS_ERKEK),SUM(ALTMIS_ALTMISDORT_YAS_KADIN),'+ 
'SUM(ALTMISBES_USTU_ERKEK),SUM(ALTMISBES_USTU_KADIN)'+ 
'FROM hastalık_istatistik '); 
Sql.Add('GROUP BY HASTALIK_TURU,KAYIT_TARIHI'); 
Sql.Add('HAVING KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis') 
ParamByName('baslangic).AsDate := MonthCalender1.Date; 
ParamByName('bitis).AsDate := MonthCalender2.Date; 
Perepare; 
Open; 
end; 
Naile Hocam dediğiniz İki Şekildede Denedim Ama yine aynı hata
Operation not applicable hatası veriyor
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Arkadaş yine yazım hatası yapmışsın :!: Tırnak ve virgüller eksik. İlk SUM olan satırda fazlalıktan tırnak var. Bunu daha yazarken farketmen lazım. Delphi IDE de renk seçeneklerini uygun şekilde verirsen, mesela string kısmın nerede başlayıp nerede bittiğini renginden anlarsın. Dolaysıyla tırnak hataları açıkça gözükür. Gerçi burada daha derlerken bile takılırsın :idea: Neyse senin için düzenleyip aşağıya yapıştırıyorum. Alıp programın içine yapıştırabilirsin.

Kod: Tümünü seç

  with DataHASTALIK.IsratistikRaporQry do
  begin
    Close;
    SQL.Clear;
    Sql.Add('SELECT HASTALIK_TURU, KAYIT_TARIHI, SUM(BIR_ONIKI_AY_ERKEK), '
          + 'SUM(BIR_ONIKI_AY_KADIN), SUM(BIR_YAS_ERKEK), '
          + 'SUM(BIR_YAS_KADIN), SUM(IKI_YAS_ERKEK), SUM(IKI_YAS_KADIN), '
          + 'SUM(UC_YAS_ERKEK), SUM(UC_YAS_KADIN), SUM(DORT_YAS_ERKEK), SUM(DORT_YAS_KADIN), '
          + 'SUM(BES_YAS_ERKEK), SUM(BES_YAS_KADIN), SUM(ALTI_YAS_ERKEK), SUM(ALTI_YAS_KADIN), '
          + 'SUM(YEDI_ONDORT_YAS_ERKEK), SUM(YEDI_ONDORT_YAS_KADIN), '
          + 'SUM(ONBES_YIRMIDORT_YAS_ERKEK), SUM(ONBES_YIRMIDORT_YAS_KADIN), '
          + 'SUM(YIRMIBES_OTUZDORT_YAS_ERKEK), SUM(YIRMIBES_OTUZDORT_YAS_KADIN), '
          + 'SUM(OTUZBES_KIRKDOKUZ_YAS_ERKEK), SUM(OTUZBES_KIRKDOKUZ_YAS_KADIN), '
          + 'SUM(ELLI_ELLIDOKUZ_YAS_ERKEK), SUM(ELLI_ELLIDOKUZ_YAS_KADIN), '
          + 'SUM(ALTMIS_ALTMISDORT_YAS_ERKEK), SUM(ALTMIS_ALTMISDORT_YAS_KADIN), '
          + 'SUM(ALTMISBES_USTU_ERKEK), SUM(ALTMISBES_USTU_KADIN) '
          + 'FROM hastalık_istatistik ');
    Sql.Add('GROUP BY HASTALIK_TURU, KAYIT_TARIHI');
    Sql.Add('HAVING KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis')
    ParamByName('baslangic').AsDate := MonthCalender1.Date;
    ParamByName('bitis').AsDate := MonthCalender2.Date;
    Perepare;
    Open;
  end;
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

Hocam Özür dilerim Onları düzeltmiştim tırnak ve virgülleri yine olmadı benim asıl sorunum şu bölümde bunları kaldırdığım zaman kusursuz çalışıyor

Kod: Tümünü seç

Sql.Add('HAVING KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis') 
    ParamByName('baslangic').AsDate := MonthCalender1.Date; 
    ParamByName('bitis').AsDate := MonthCalender2.Date; 
    Perepare; 
    Open; 
  end; 
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

sayın rsimsek hocam yazdığınız kodun aynısını alıp kopyaladım
ama hata yine aynı sanırım ODBC Driver demi bir sorun var .
hata Operation not applicable hatası
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

O bölümü kaldırdığınızda kusursuz çalışması normal

Kod: Tümünü seç

KAYIT_TARIHI>=:baslangic and KAYIT_TARIHI<=:bitis'
Şu kısma şöyle bir tarih yazıp bi dener misin

KAYIT_TARIHI>='2006-01-01' and KAYIT_TARIHI<='2006-12-30'
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

Hocam O şekildede çalışmadı
sanırım hata odbc 3.51 driveri 2.5 la denedim oldu
yusuf
Üye
Mesajlar: 139
Kayıt: 20 Tem 2005 11:05
Konum: İSTANBUL

Mesaj gönderen yusuf »

naile hocam verdiğiniz örnek çalıştı teşekkür ederim fakat tarihleride gurupluyor tarihleri guruplamadan iki tarih arası girilen kayıtlar arasından
hastalık türlerine göre gruplama yapabilirmiyiz
daha önceki sorunda Myodbc 3.51 driverle çalışmadı fakat 2.5 MyOdbc driverle çalıştı
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

KAYIT_TARIHI alanını Select kısmından ve GROUP BY dan silmen yeterli :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla