Sql Sorgusu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Sql Sorgusu

Mesaj gönderen sado.320 »

Arkadaşlar merhaba benim bir şartım var bu şart ;

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('Select * from Degisim');
DegisimADOQuery.SQL.Add('where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2)');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
bu şart teknisyen alanını boş geçtiğimde sadece tarihler arası kayıt geliyor ve sonra benim istediğim seçtiğim tarihler arası kayıtlar hangi teknisyen adı kaç kere geçiyor onu hesaplamaya çalıştım ama count komutu verin tabanındaki bütün teknisyenlerin isim kaç kere geçtiğini hesaplıyor.Benim istediğim sadece dbgrid üzerine gelen kayıtlardaki teknisyen adı sayısını vermesin için aşağıdaki sql komutunda neresinde düzeltme yapabilirim.

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Open;
frxReport2.ShowReport();
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql Sorgusu

Mesaj gönderen ertank »

Ben sorunu anlayamadım. Biraz daha detaylı sorabilir misin? Ekran görüntüleri ile belki?
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Re: Sql Sorgusu

Mesaj gönderen sado.320 »

ertank yazdı:Ben sorunu anlayamadım. Biraz daha detaylı sorabilir misin? Ekran görüntüleri ile belki?

dbgrid üzerindeki teknisyenlerin adı kaç kere geçiyor örnek resim;

Resim


örnek

mecit kar:30
hasan demir:12
fahrettin :10
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql Sorgusu

Mesaj gönderen ertank »

Aşağıdaki kodu deneyebilir misin?

- DBLookupComboBox1.Text boş olduğu zaman sadece tarih aralığındaki teknisyenler listelenir.
- Eğer Teknisyen bazında kısıtlama yapmak istemiyorsan 4ncü satırdaki "Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and " kısmını ve en sondaki parantez kapatma karakterini SQL içinden kaldırabilirsin.
- Son olarak eğer yoksa Teknisyen, Tar1, Tar2 kolonlarına database tablosuda indeks tanımlamanı öneririm.

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim');
DegisimADOQuery.SQL.Add('Where Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2))');
DegisimADOQuery.SQL.Add('GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value := DateToStr(DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Prepare;
DegisimADOQuery.Open;
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Re: Sql Sorgusu

Mesaj gönderen sado.320 »

ertank yazdı:Aşağıdaki kodu deneyebilir misin?

- DBLookupComboBox1.Text boş olduğu zaman sadece tarih aralığındaki teknisyenler listelenir.
- Eğer Teknisyen bazında kısıtlama yapmak istemiyorsan 4ncü satırdaki "Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and " kısmını ve en sondaki parantez kapatma karakterini SQL içinden kaldırabilirsin.
- Son olarak eğer yoksa Teknisyen, Tar1, Tar2 kolonlarına database tablosuda indeks tanımlamanı öneririm.

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim');
DegisimADOQuery.SQL.Add('Where Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2))');
DegisimADOQuery.SQL.Add('GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value := DateToStr(DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Prepare;
DegisimADOQuery.Open;
Öncelikle uğraştığın için teşekkür kodun çalışıyor ama benim isteğim tam olarak tarihler arasındaki gelen kayıtlarda o teknisyenlerin hesaplamak burada veritabanındaki bütün kayıtların teknisyen isimleri hesaplıyor.İlgilenğiniz için teşekkürler.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql Sorgusu

Mesaj gönderen ertank »

Tarih aralığı kıstası çalışmaz ise eğer tablodaki tüm teknisyenler gösterilir. Ben senin ilk kodunu görünce o şekilde çalışıyor diye düşünmüştüm. Muhtemelen tarih parametresinde sorun vardır. İlgili satırları aşağıdaki gibi değiştirerek tekrar dener misin?

Ayrıca BETWEEN yerine ">=" ve "<=" kullanmanı öneririm. Yanlış biliyorsam beni düzeltin. BETWEEN tam olarak arasında demek. Verdiğin tarihler bunun dışında kalır. Bir yerde ">" ve "<" gibi çalışır.

Kod: Tümünü seç

DegisimADOQuery.Parameters.ParamByName('Tar1').AsString := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').AsString := FormatDateTime('yyyy-mm-dd', DateTimePicker2.Date);
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Re: Sql Sorgusu

Mesaj gönderen sado.320 »

ertank yazdı:Tarih aralığı kıstası çalışmaz ise eğer tablodaki tüm teknisyenler gösterilir. Ben senin ilk kodunu görünce o şekilde çalışıyor diye düşünmüştüm. Muhtemelen tarih parametresinde sorun vardır. İlgili satırları aşağıdaki gibi değiştirerek tekrar dener misin?

Ayrıca BETWEEN yerine ">=" ve "<=" kullanmanı öneririm. Yanlış biliyorsam beni düzeltin. BETWEEN tam olarak arasında demek. Verdiğin tarihler bunun dışında kalır. Bir yerde ">" ve "<" gibi çalışır.

Kod: Tümünü seç

DegisimADOQuery.Parameters.ParamByName('Tar1').AsString := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').AsString := FormatDateTime('yyyy-mm-dd', DateTimePicker2.Date);
Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: Sql Sorgusu

Mesaj gönderen erdogan_ozkaya »

Personel performans dökümü almak istiyorsun ?
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: Sql Sorgusu

Mesaj gönderen erdogan_ozkaya »

MERHABA

PERSONEL PERFORMANS DÖKÜMÜ BELKİ İŞİNE YARAR.

Kod: Tümünü seç

         Memo1.Clear;
         SERVIS_KABUL_DB.Close;
         SERVIS_KABUL_DB.SQL.Clear;

         SERVIS_KABUL_DB.SQL.Add(' SELECT Cari_ID, Genel_Cari_Unvan,TOPLAM.SAYI, TOPLAM.TOTAL');
         SERVIS_KABUL_DB.SQL.Add(' FROM dbo.CARI_KART_LISTE PER,');
         SERVIS_KABUL_DB.SQL.Add(' (SELECT TAMIR_EDEN,COUNT(SERVIS_ID) SAYI,SUM(SATIR_TOPLAMI) TOTAL');
         SERVIS_KABUL_DB.SQL.Add(' FROM dbo.SERVIS_KAYIT');
         SERVIS_KABUL_DB.SQL.Add(' WHERE (ISLEM_TARIHI BETWEEN :Tar1 and :Tar2)');
         SERVIS_KABUL_DB.Parameters.ParamByName('Tar1').Value :=dtp1.Date; // FormatDateTime('DD/MM/YYYY',dtp1.date);
         SERVIS_KABUL_DB.Parameters.ParamByName('Tar2').Value :=dtp2.Date;  // FormatDateTime('DD/MM/YYYY',dtp2.date+1);

         SERVIS_KABUL_DB.SQL.Add(' and CALISILAN_FIRMA='+QuotedStr(Ana_Pencere.DBEdit6.Text)+'');

         if ComboBox1.Text<>'Tüm Kayıtlar' then
         SERVIS_KABUL_DB.SQL.Add(' and MARKA_ADI='+QuotedStr(ComboBox1.Text)+'');

         if ComboBox2.Text<>'' then
         SERVIS_KABUL_DB.SQL.Add(' and MODEL_ADI='+QuotedStr(ComboBox2.Text)+'');

         if ComboBox3.Text<>'Tüm Kayıtlar' then
         SERVIS_KABUL_DB.SQL.Add(' and GARANTI='+QuotedStr(ComboBox3.Text)+'');

         if ComboBox4.Text<>'Tüm Kayıtlar' then
         SERVIS_KABUL_DB.SQL.Add(' and GUNCEL_DURUMU='+QuotedStr(ComboBox4.Text)+'');

         SERVIS_KABUL_DB.SQL.Add('GROUP BY TAMIR_EDEN) TOPLAM');
         SERVIS_KABUL_DB.SQL.Add('WHERE PER.Cari_ID=TOPLAM.TAMIR_EDEN');
         SERVIS_KABUL_DB.SQL.Add('AND PER.CARI_TIP = '+QuotedStr('Personel')+'');
         Memo1.Lines.add(SERVIS_KABUL_DB.SQL.Text);
         SERVIS_KABUL_DB.Open;
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql Sorgusu

Mesaj gönderen ertank »

sado.320 yazdı: Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
İlgili tüm kodu paylaşabilir misin? Hesaplama yapmana gerek yok normalde bu SQL ile. SQL sonucu senin istediğin oluyor çünkü. Sanki hesabı sen kendin kod ile yapıyormuşsun gibi geldi bana yazdığından. Anlamadım.
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Re: Sql Sorgusu

Mesaj gönderen sado.320 »

ertank yazdı:
sado.320 yazdı: Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
İlgili tüm kodu paylaşabilir misin? Hesaplama yapmana gerek yok normalde bu SQL ile. SQL sonucu senin istediğin oluyor çünkü. Sanki hesabı sen kendin kod ile yapıyormuşsun gibi geldi bana yazdığından. Anlamadım.
hocam benim yapmak istediğim arttığım tarihler arasında hangi teknisyenin toplam ne kadar araca baktım bulmak istiyorum. Veritabanım daki alanlar
Resim

arama ekranım
Resim

kodum ise budur. Bu koda toplam işlemeni neresin eklemem lazım

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('Select * from Degisim');
DegisimADOQuery.SQL.Add('where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2)');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sql Sorgusu

Mesaj gönderen esistem »

Selam,
Sizin verdiğiniz tablo üzerinde hangi teknisyen hangi tarihte hangi plakaya (müşteriye) bakım yapmış onu görüyorsunuz, Hangi teknisyen kaç kez bakım yapmış şeklinde görmek isteseniz mecburen ayrı bir grid de göstermeniz gerekir, verdiğiniz tablo üzerinde gösteremezsiniz, yada gösterirsiniz ama biraz karmaşık bir sql yazmanız gerekir ki oda görüntü olarak hoş durmaz zaten, bunun için count(*) kullanmalısınız, ayrı bir query de ;

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim GROUP BY Teknisyen where tarih>=T1 AND tarih<=:T2');
DegisimADOQuery.Open;
şeklinde (sizinde en başta yazdığınız) basit bir sorgu işinizi görecektir. Sadece tarih aralığı vermeniz yeterli olacaktır yani.
m_yaprakci

Re: Sql Sorgusu

Mesaj gönderen m_yaprakci »

Select count(teknisyen) as bakimmiktari, teknisyen from....
Where....
Group by teknisyen

Select * fromdan sonra group by bircok field farkli degerler dondurecegi icin toplami alamaz.
Bunu asmak icin soyle yapilabilir. Deneme imkanim yok ama.

Select *, (Select count(teknisyen) from degisim where teknisyenadi like...) as degisimmiktari from degisim where
sado.320
Üye
Mesajlar: 28
Kayıt: 18 Nis 2016 01:53

Re: Sql Sorgusu

Mesaj gönderen sado.320 »

m_yaprakci yazdı:Select count(teknisyen) as bakimmiktari, teknisyen from....
Where....
Group by teknisyen

Select * fromdan sonra group by bircok field farkli degerler dondurecegi icin toplami alamaz.
Bunu asmak icin soyle yapilabilir. Deneme imkanim yok ama.

Select *, (Select count(teknisyen) from degisim where teknisyenadi like...) as degisimmiktari from degisim where
uğraştığın için teşekkür ederim. Sorunu çözdüm kod bu şekilde ;

Kod: Tümünü seç

DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim where (Degisim_tarihi between :tar1 and :tar2)GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
frxReport2.ShowReport();
Cevapla