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 »

Herkese merhaba,

Firebird'de aşağıdaki gibi bir table çıktısını;

Kod: Tümünü seç

sicil        tarih         saat

0001     01.01        08:00
0001     01.01        13:00
0001     01.01        14:00
0001     01.01        17:00
0001     01.01        18:00
0001     02.01        08:00
0001     03.01        09:00
0002     01.01        07:00
0002     02.01        11:00
aşağıdaki şekle getiren sql cümlesini nasıl yazarım acaba (Fahrettin abinin bu konuya hassas olduğunu biliyorum :D ne yapar yapar bu sql i yazar :D )

Kod: Tümünü seç

sicil          tarih1       saat1         tarih2          saat2

0001        01.01       08:00         01.01          13:00
0001        01.01       14:00         01.01          17:00
0001        01.01       18:00         02.01          08:00
0001        03.01       09:00          
0002        01.01       07:00         11:00  
şeklinde.

Özetlemek gerekirse sicilnoya göre iki iki guruplamak istiyorum. Mesela 0001 nolu kişinin 7 tane hareketi var çıktıda görüldüğü gibi 3 sıra çift hareket geriye kalan tek hareketse en alt satırda.

Şimdiden teşekkürler. Kolay Gelsin...
onaydin

Mesaj gönderen onaydin »

Ben yazdım diye buraya gelmiştim ama
soruyu tekrar okuyunca aynı satırda farklı günler olabileceğini belirtmişsiniz
ben ona göre yapmamaıştım ama bu şekilde gidilirse oylesi de olur;
kullanılan tablo

Kod: Tümünü seç

CREATE TABLE SICIL
(
  ISLEM_NO              INTEGER         NOT NULL,
  SICIL                 INTEGER,
  TARIH                    DATE,
  SAAT                     TIME,
 CONSTRAINT PK_SICIL PRIMARY KEY (ISLEM_NO)
);
bi tane procedure var
rfunc udf library den mod fonksiyonu kullanılıyor;

Kod: Tümünü seç

CREATE PROCEDURE P_PERSONEL_SICIL (
  DEGER SmallInt)
 returns (
  SICIL_NO Integer,
  TARIH_1 Date,
  SAAT_1 Time,
  ID SmallInt,
  ISLEM_NO Integer)
AS
declare variable i smallint;
begin
 FOR SELECT SICIL,TARIH from SICIL group by SICIL,TARIH into :SICIL_NO,:TARIH_1
 DO
  BEGIN
    i = 1;
    ID = -1;
    DEGER = 0;
    FOR SELECT ISLEM_NO,SAAT from SICIL where SICIL = :SICIL_NO and TARIH = :TARIH_1 into :ISLEM_NO,:SAAT_1
     DO
      BEGIN

      if(mod(i,2)=0) then
       begin
        ID = DEGER;
        DEGER = DEGER + 1;

       end
      else
       begin
        ID = ID +1;
       end
       i = i+1;
      suspend;
     END
  END
end
select i

Kod: Tümünü seç

select P1.SICIL_NO,P1.TARIH_1,P1.SAAT_1,P2.SAAT_1 from P_PERSONEL_SICIL(0) P1
inner join P_PERSONEL_SICIL(0) P2  on (P1.ID = P2.ID)
where
P1.SAAT_1 <> P2.SAAT_1 and
P1.SAAT_1 < P2.SAAT_1  and
P1.TARIH_1 = P2.TARIH_1 and
P1.SICIL_NO = P2.SICIL_NO
union
select SICIL_NO,TARIH_1, SAAT_1,cast('00:00:00' as time) from P_PERSONEL_SICIL(0)
where ISLEM_NO not in (select P1.ISLEM_NO from P_PERSONEL_SICIL(0) P1
inner join P_PERSONEL_SICIL(0) P2  on P1.ID = P2.ID
where P1.SAAT_1 <> P2.SAAT_1 and P1.SAAT_1 < P2.SAAT_1  and P1.TARIH_1 = P2.TARIH_1
and
P1.SICIL_NO = P2.SICIL_NO
)
and ISLEM_NO not in (select P2.ISLEM_NO from P_PERSONEL_SICIL(0) P1
inner join P_PERSONEL_SICIL(0) P2  on P1.ID = P2.ID
where P1.SAAT_1 <> P2.SAAT_1 and P1.SAAT_1 < P2.SAAT_1  and P1.TARIH_1 = P2.TARIH_1
and
P1.SICIL_NO = P2.SICIL_NO
)
yine sağ elimle sol kulağımı tutum gibime geliyor :roll:
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. bugün bakıp nasıl çözdüğümü yazmaya çalışırım.

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

Mesaj gönderen fahrettin »

geç kaldık iş galiba çözülmüş.. :)
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla