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 »

Arkadaşlar Merhaba;

Kod: Tümünü seç

Table1 
--------------
başlangıç        bitiş                  isim

08:00              12:00               sabah
12:01              16:00               öğle
16:01              19:00               ikindi 
19:01              23:00               akşam
23:01              07:59               mesai

Kod: Tümünü seç

Table Hareket 

sicil             tarih                         saat         

0001           01.01.2004                08:00
0001           01.01.2004                12:32
0001           01.01.2004                13:00
0002           01.01.2004                09:00
0002           01.01.2004                11:00
0002           01.01.2004                14:00
Sonuç ise

Kod: Tümünü seç

sicil        tarih             08-12        12-16       16-19      19-23     23-08 

0001     01.01.2004              1              2 
0002     01.01.2004              2              1
özetlemek gerekirse, table 1'de saat aralıkları var. harekette ise giriş saatleri var. sonuç olarak table 1 deki saat aralıklarından toplam kaçar defa giriş yapılmış.

Şimdiden teşekkürler....
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Non-Equijoin isimli bir join tipi var ki örneklendirmek zordur ama bu işte tam uygun bir örnek oldu..... Aşağıdaki kodun ürettiği sonuç tam istenilen sonuç değil ama ara bir kademe...

Kod: Tümünü seç

Select H.sicil, H.tarih, T.isim
from hareket as H, table1 as T
where H.saat between T.baslangic and T.bitis
Eğer sybase kullanıyorsanız :) istediginiz sonuca bu kademeden sıçrayabilirsiniz....

Kod: Tümünü seç

Select AAA.sicil, AAA.tarih, 
SABAH=sum (if AAA.isim='sabah' then 1 else 0 endif),
OGLE=sum (if AAA.isim='öğle' then 1 else 0 endif),
IKINDI=sum (if AAA.isim='ikindi' then 1 else 0 endif),
AKSAM=sum (if AAA.isim='akşam' then 1 else 0 endif),
MESAI=sum (if AAA.isim='mesai' then 1 else 0 endif)
from (Select H.sicil, H.tarih, T.isim
from hareket as H, table1 as T
where H.saat between T.baslangic and T.bitis) as AAA 
group by AAA.sicil, AAA.tarih
* 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, cevabını merakla bekliyordum :) . Cevap için teşekkürler.
Ama maalesef sybase değil interbase 6 kullanıyorum.
onaydin

Mesaj gönderen onaydin »

Firebird kullananlar için;

Kod: Tümünü seç

SELECT sicil, tarih,
sum(case when z.isim = '1' then 1 else 0 end)  AS sabah,
sum(case when z.isim = '2' then 1 else 0 end)  AS ogle,
sum(case when z.isim = '3' then 1 else 0 end)  AS ikindi,
sum(case when z.isim = '4' then 1 else 0 end)  AS aksam,
count(sicil) AS TOPLAM_GIRIS_CIKIS
FROM hareket h, zamanlar z
WHERE h.saat
BETWEEN z.baslangic AND z.bitis
GROUP  BY sicil, h.tarih
Case kullanımını interbase 6 da var olup olmadığını bilmiyorum ama yoksa kabaca
select deyip
içine 5 tane count hesaplayan ve zamanlar tablosuyla dıştaki tablonunun siciline join olmuş her bir vakit için ayrı bir sql hazırlayıp
from la kapatıp hareket tablosunun sicil ve tarih alanınına group by yapıldığında sonuca ulaşılılabilir gibime geliyor.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Cevap için teşekkürler.

Firebird kurarak case'nin çalışmasını sağladım, fakat komutun tam olarak ne yaptığını anlayamadım. Bir açıklama yazabilirseniz sevinirim.

Kolay Gelsin...
onaydin

Mesaj gönderen onaydin »

case le mysql ya da sybase in if ile yaptığı şeyi yapıyoruz
eğer o satır için değer buysa bu olsun değilse şu olsun diyor.
Burdaki kullanımda ise eğer değer 3 ise bir olsun değilse 0 olsun diyor
dışındaki sum da bu birleri topluyor 0 dönen sonuçların toplama bir etkisi olmadığından biz sadece istediğimiz değere ulaşıyoruz.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Cevaplar için çok teşekkürler, tam istediğim gibi oldu...
Cevapla