Sql Cümlesi

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
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Sql Cümlesi

Mesaj gönderen bgoktas »

Aşağıda anlattığım olaya nasıl bir query yazabilirim acaba????


tablo şu şekilde;

sicilno tarih saat gc
----------------------------------------------
0001 01.01.2004 08:00 giris
0001 01.01.2004 12:00 cikis
0001 01.01.2004 13:00 giris
0001 01.01.2004 14:00 cikis
0001 01.01.2004 16:00 giris
0001 01.01.2004 18:00 cikis
0001 02.01.2004 08:00 giris
0001 02.01.2004 12:00 cikis
0001 02.01.2004 13:00 giris
0001 02.01.2004 14:00 cikis
0001 02.01.2004 16:00 giris
0001 02.01.2004 18:00 cikis
0001 03.01.2004 08:00 giris
0001 03.01.2004 12:00 cikis
0001 03.01.2004 13:00 giris
0001 03.01.2004 14:00 cikis
0001 03.01.2004 16:00 giris
0001 03.01.2004 18:00 cikis
0001 05.01.2004 08:00 giris
0001 05.01.2004 12:00 cikis
0001 05.01.2004 13:00 giris
0001 05.01.2004 14:00 cikis
0001 05.01.2004 16:00 giris
0001 05.01.2004 18:00 cikis

çıktı ise öyle olmalı;


sicil tarih giriş çıkış giriş çıkış giriş çıkış giriş çıkış
--------------------------------------------------------------------------------
0001 01.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 02.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 03.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 04.01.2004 --:-- --:-- --:-- --:-- --:-- --:--
0001 05.01.2004 08:00 12:00 13:00 14:00 16:00 18:00


yukarıdaki giriş çıkışların sayısı 10 giriş 10 çıkış olmak üzere max 20.

Lütfen içinizden yuh be kalk bari programıda biz yazalım demeyin lütfen :D

Bu işlemi tamamen kodlarla iç içe üç döngü ile yaptım lakin baya yavaş çalışıyor. Hani bu işin kolay ve hızlı bir yolu varsa yardımlarınızı beklerim.
Tamamen sqlle çözülmez diye düşünüyorum.
Biraz kodda gerekiyor herhalde
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bu da benim zayıf noktam.... sql ile yapılacağına inanılmayan sorguları sql ile yapmaya çalışmak.... :D

Şaka bir yana sadece select statement ile bile olabilir gibi. Ama bazı şartlara bağlı çok kolay degil. Bir stored procedure ile her halukarda yapılır zaten....
Oncelikle veritabanınız nedir? stored procedure kullanma imkanınız var mı?

Bunun dışında şunu sorayım mesela tabloda çıkış olmadan giriş olursa ne olacak? Yani adam bir şekilde kartını geçirmeden çıkıp arka arkaya iki kez girerse rapor formatı ne olacak? Bir de bir kişi arada fazla giriş çıkış yaparsa soyle mi kayma olacak?

sicil tarih giriş çıkış giriş çıkış giriş çıkış giriş çıkış
--------------------------------------------------------------------------------
0001 01.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 02.01.2004 08:00 10:00 11:00 12:00 13:00 14:00 16:00 18:00
0001 03.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 04.01.2004 --:-- --:-- --:-- --:-- --:-- --:--
0001 05.01.2004 08:00 12:00 13:00 14:00 16:00 18:00

Velhasıl sql ile bir şeyler yapabiliriz gibime geliyor.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

sorduğu soruya "şu veritabanını kullanıyorum" diye yazanı seminerde alnından öpeceğim :lol:
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Abi öncelikle sorudan yaptığımız işi hemende anladın bravo :D :D :D
Databasem:=interbase;
stored pros:=hiç yazmadım;

hareket bir tane fazla olursa yaptığınız gibi olacak

ayrıca örnekte vermeyi unutmuşum;

bir gün önce girdiyse ve o gün çıkmadıysa bir gün sonra çıktıysa data şöyle olacak;

sicil tarih giriş çıkış giriş çıkış giriş çıkış giriş çıkış
--------------------------------------------------------------------------------
0001 01.01.2004 08:00 12:00 13:00 14:00 16:00 18:00
0001 02.01.2004 08:00 10:00 11:00 12:00 13:00 14:00 16:00 18:00
0001 03.01.2004 08:00 12:00 13:00 14:00 16:00 18:00 17:00
0001 04.01.2004 --:-- 08:00 --:-- --:-- --:-- --:--
0001 05.01.2004 08:00 12:00 13:00 14:00 16:00 18:00

hocam bir fikir çıkarsa ne ala, ne ala
En son bgoktas tarafından 06 May 2004 05:43 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Admin yazdı:sorduğu soruya "şu veritabanını kullanıyorum" diye yazanı seminerde alnından öpeceğim
abi kusura bakma bir önceki cevapta databasemi yazdım

databasem:interbase 6
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Dedim ya bu da benim zayıf noktam.....
Problem üzerinde biraz düşündüm ve bir deniyim dedim....

Aslında bir kod yazdım ama bu kod sybase'de calismasina ragmen Interbase'de calismiyor. Calıstırmak icin yaptığım değişiklik de olayı oldukça yavaşlatıyor ve hatta kodu da cok buyutuyor....

Orjinal kod sybase'de calisan sekli su:

Kod: Tümünü seç

Select SICIL_NO, TARIH,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis')) as GIRIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris')) as CIKIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>GIRIS1) as GIRIS2,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>CIKIC1) as CIKIS2,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>GIRIS2) as GIRIS3,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>CIKIC2) as CIKIS3,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>GIRIS3) as GIRIS4,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>CIKIC3) as CIKIS4,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>GIRIS4) as GIRIS5,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>CIKIC4) as CIKIS5
from HAREKET H
where SICIL_NO='001'
group by SICIL_NO, TARIH
order by SICIL_NO, TARIH
Fakat bu kod Interbase'de calismiyor cunku Interbase select statement icinde bir alanın veya hesaplama sonucunun atandığı alias'ı kullanmaya imkan vermiyor... Yani su koda calismiyor

Kod: Tümünü seç

Select 5 as SAYI1, 6 as SAYI2, SAYI1+SAYI2 as SAYI3 
from HAREKET
Burada SAYI1 i tanımıyor.... En azindan ben bunu başaramadım belki Firebird bunu başarabliyor olabilir deneyen arkadaslar bildirirse sevinirim....

Bu durumda 1. giris cikistan sonrakilerin hesabinda bir onceki hareket bilgisini kullanmak icin alias kullanmak yerine o ailasi olusturan hesaplamanın tamamını koyarak da yapabiliriz tabi. Ama bu olayı cok yavaslatıyor. Bunu 2i giris cikislar icin yapıp interbase'de calistirdim... Su sekilde:

Kod: Tümünü seç

(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis')) as GIRIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris')) as CIKIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis'))) as GIRIS2,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris'))) as CIKIS2
from HAREKET H
where SICIL_NO='001'
group by SICIL_NO, TARIH
order by SICIL_NO, TARIH
Bir kademe daha ilerleyip 3. giriş cikislari da ekleyince kod su hale geliyor

Kod: Tümünü seç

Select SICIL_NO, TARIH,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis')) as GIRIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris')) as CIKIS1,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis'))) as GIRIS2,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris'))) as CIKIS2,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris' and H1.SAAT<(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis')))) as GIRIS3,
(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Cikis' and H1.SAAT>(Select min(SAAT) from HAREKET H1 where H1.SICIL_NO=H.SICIL_NO and H1.TARIH=H.TARIH and H1.GC='Giris')))) as CIKIS3
from HAREKET H
where SICIL_NO='001'
group by SICIL_NO, TARIH
order by SICIL_NO, TARIH
ve sorgu zamanı 2 katına cikiyor...

Velhasıl eger alias'i yine select icinde kullanabilme durumuna bir care bulabilirseniz ya da dedigim gibi firebird destekliyorsa da ona gecerseniz bu sorug isinizi gorur... Performansı cok problem degil. Yani yeterki bu mesele asilsin. Bir stored procedure veya fonksiyon destegi ile perofrmans arttırılabilir...

Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Fahrettin abi öncelikle cevap için teşekkürler.
Kesinlikle sql konusunda ufkumu açtığını söyleyebilirim.
Denemelerim sonucu interbase'dede firebird'dede aliaslar çalışmadığını anladım. Diğer kodları denediğimde ise çok fazla yavaş olduğunu gördüm,
başlangıç için çok güzel fikirler verdi bana :idea:

Orjinal kod dediğiniz sybasedeki kod sizde sağlıklı çalışıyormu :?:

yani yukarıda anlattığım gibi mesela kişi ;

aynı gün girdi,çıktı,girdi
birgün sonra çıktı veya

08:00 12:00 13:00
--:-- 08:00 --:--


yada girdi,çıktı 2 gün gelmedi,sonra tekrar girdi çıktı

08:00 18:00
--:-- --:--
--:-- --:--
08:00 19:00



gibi durumlarda çalışıyormu :?:
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Acikcasi aynı tablolari oturup tekrar sybase'de yapıp denemedim... Fakat calisacagindan eminim.. Yani belki bir takım buglar olabilir ama bu buglar da biraz uğraşarak halledilir. Bundan eminim....

Kolay gelsin......
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Cevaplar için teşekkürler
Cevapla