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

sql cümlesi

Mesaj gönderen bgoktas »

hareket tablesi

Kod: Tümünü seç

sicilno
 tarih
 saat
sicil no ve tarihe göre gruplama yapıyorum. ve o kişinin ilgili tarihteki hareket sayısı 1 ise o kişiye otomatik olarak bir hareket eklemek istiyorum.

Kod: Tümünü seç

insert into hareket(sicilno,tarih)
select hareket.sicilno,hareket.tarih from hareket
where tarih>=:tarih1 and tarih<=:tarih2
group by hareket.sicilno,hareket.tarih
having count(*)=1
bu şekilde eklemeyi yapıyor. Velakin, saat alanınıda eklemek istiyorum ama beceremedim.

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat)
select hareket.sicilno,hareket.tarih from hareket
where tarih>=:tarih1 and tarih<=:tarih2
group by hareket.sicilno,hareket.tarih
having count(*)=1,'19:00'
şeklinde denedim ama olmadı. Bilmem anlatabildim mi?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bülent kardeş,
select te (sicilno,tarih,saat) diye üç alanı insert etmek istemişsin fakat
select hareket.sicilno,hareket.tarih from hareket ..kısmında diye iki alan döndürmüşsün :idea: yani saate bir değer döndürmemişsin.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

abi sorun orada zaten :)

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat) 
select hareket.sicilno,hareket.tarih from hareket 
where tarih>=:tarih1 and tarih<=:tarih2 
group by hareket.sicilno,hareket.tarih 
having count(*)=1,'19:00'
en sondaki virgülden sonraki tırnak içerisindeki '19:00' ifadesi, saat ile eşleşecek ama syntax poblemi yaşıyoruz herhalde.

Bu arada database Firebird
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

evet gördüm.
fakat hem select hem sabit değer atayabileceğini sanmıyorum. sen o kısmı select in içinde vermeye çalış bence.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

insert in yapısına bakarsan;
INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]
{VALUES (<val> [, <val> …]) | <select_expr>};
ya select.... ya değer diyor, ikisi bir anda değil :idea: :?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

'19:00:00' seklinde dene birde
yada

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat)
values(
       (select h1.sicilno from hareket h1
        where h1.tarih>=:tarih1 and h1.tarih<=:tarih2
        group by h1.sicilno,h1.tarih having count(*)=1)
       ,(select h2.tarih from hareket h2
        where h2.tarih>=:tarih1 and h2.tarih<=:tarih2
        group by h2.sicilno,h2.tarih having count(*)=1)
      ,'19:00:00')
seklinde dene birde
ÜŞENME,ERTELEME,VAZGEÇME
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Kod: Tümünü seç

multiple rows in singleton select
.
hatası veriyor.

Abi, group by satırına yazılanlar select yanında belirtilmeli değil mi?
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

oyle bir zorunluluk yok bildigim kadarıyle
sadece select yanındakiler group by icinde mutlaka bildirilmeli
soylemeyi unuttum yukardaki ornegi eger tek bir kayıt donduruyor ise yazabiliriz.
yapmak istedigini tam anlayamadım aslında
bir tarih aralıgında giris yapıp cıkıs yapmayanları mı bulmak istiyorsun?
ÜŞENME,ERTELEME,VAZGEÇME
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

çıkış yapmayanlara otomatik olarak 19:00 (buradaki 19 parametrik) da çıkmış yazacağım. muhtemelen stor. proc ile yapacağız.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Hocam eger Values kullanırsan tek bir row insert edebilirsin ve icindeki select ifadesi tek bir deger donmeli....
Fakat verdigi hata da zaten cok satir dondugunu soyluyor...

O zaman values kullanmadan ilk iafade tarzinda insert into .... select.... ifadesi kullanmalisin...

FAKAT.... ufak bir fark ile ilave sutunları da select in icine koymalisin.... Kural su insert into da nsonraki select ifadesi bagimsiz olarak calisip bir sonuc donebilen bir ifade olmali.... O donen sonuclari toplu olarak insert edebilmek icin onune insert into koymalisin..... Yani:

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat) 
select hareket.sicilno,hareket.tarih ,'19:00' as SAAT from hareket 
where tarih>=:tarih1 and tarih<=:tarih2 
group by hareket.sicilno,hareket.tarih 
having count(*)=1
Tabi SP ye de gerek kalmiyor bu durumda.... :)
* 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 »

Kod: Tümünü seç

SQLEditorForm.Query:
Overflow occurred during data type conversion.
conversion error from string "19:00".
Fahrettin abi cevap için teşekkürler. Fakat saat alanı timestamp olduğundan yukarıdaki hatayı verdi.

dönüşüm yapmak gerekiyor herhalde...
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

evet....

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat) 
select hareket.sicilno,hareket.tarih ,casat('19:00' as timestamp) as SAAT from hareket 
where tarih>=:tarih1 and tarih<=:tarih2 
group by hareket.sicilno,hareket.tarih 
having count(*)=1
Şeklinde olmali....
* 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 »

Hocam Allah Ebeden razı olsun. Sorunu çözdük, velakin table index yapısı itibari ile aynı kayıt yazılmaması lazım ve benin cast içerisindeki ifadeyi parametrik göndermem gerekiyor.

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat,tarihsaat)

  select hareket.sicilno,hareket.tarih,
         cast((:saat_new) as time) as SAAT,
         cast((:tarihsaat_new) as timestamp) as TARIHSAAT

  from hareket where tarih>=:tarih1 and tarih<=:tarih2

  group by hareket.sicilno,hareket.tarih

  having count(*)=1
şeklinde çalıştırdığımda;

Kod: Tümünü seç

SQLEditorForm.Query:
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Data type unknown.
hatasını veriyor.
fakat

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat,tarihsaat)

  select hareket.sicilno,hareket.tarih,
         cast(('19:00') as time) as SAAT,
         cast(('01.01.2005 19:00') as timestamp) as TARIHSAAT

  from hareket where tarih>=:tarih1 and tarih<=:tarih2

  group by hareket.sicilno,hareket.tarih

  having count(*)=1
şeklinde çalışıyor :?: (ilk paragraftaki hatayı veriyor.)
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Hocam sen de dogrudan tip donusumu yapmaksizin komple time tipinde parametre kullan...

Kod: Tümünü seç

insert into hareket(sicilno,tarih,saat,tarihsaat) 

  select hareket.sicilno,hareket.tarih, 
         :saat_new, 
         :tarihsaat_new
  from hareket where tarih>=:tarih1 and tarih<=:tarih2 

  group by hareket.sicilno,hareket.tarih 

  having count(*)=1
Gibi mesela.... Tabi parametrelerin tiplerini sırasıyle time ve timestamp göndermen gerekli....
* 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 »

deneyip sonucu yazacağım inşaallah...
Cevapla