Between ile Toplu Update

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
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Between ile Toplu Update

Mesaj gönderen selm@n »

SelamunAleykum;

toplu bir update olayım var ama bir türlü yapamadım...
senaryo şöyle;

A adında bir Tablom var ...
P_SICIL INTEGER,
MAAS DOUBLE PRECISION; alanım var

PRIM adında bir tane daha table var...
Alanları şöyle...

Kod: Tümünü seç

 P_NO       INTEGER,
 P_SICIL    INTEGER, 
 P_GUN      VARCHAR(2),
 P_AY       VARCHAR(2),
 P_YIL      VARCHAR(4),
 P_ODEME    DOUBLE PRECISION,
mesela bir örnek vereyim ....

A Table ;

Kod: Tümünü seç

P_SICIL                MAAS
------------          -----------------
1                         1000
2                         1000
3                         1200
4                         1100
...                        ....
...                        ....
 
PRIM Table ;

Kod: Tümünü seç

P_NO      P_SICIL        P_GUN        P_AY     P_YIL    P_ODEME
-------- ------------    ---------- -------   -------   -----------
1               1             01        01       2004     500
2               1             10        01       2004     500
3               2             10        01       2004     200
4               3             10        01       2004     300
5               4             20        01       2004     500
yapmak istediğim PRIM Table da sicil ay ve yıl'a göre bir group'layıp P_ODEME alanını SUM yaparak
A table daki MAAS + SUM'dan gelen değer ile arttırmak istiyorum...yani update ettiğim zaman A tablosu aşağıdaki gibi olacak..

A Table ;

Kod: Tümünü seç

P_SICIL                MAAS
-----------------------------
1                      2000
2                      1200
3                      1500
4                      1600
...                    ....
...                    ....
gibi

ama kullanıcı bunu yaparken şöyle birşey istiyor ;

1 nolu sicilden 2 nolu sicile kadar yap.. yani between olayı var..(işte işler burda karışıyor..)..

1 den 2 kadar olan sicil aralığını yap dediğimde PRIM tablosuna gidecek ve verilen sicil aralığına bakacak vede verilen ay yıl'a
göre bir group yapıp P_ODEME alanı SUM ederek A tablosundaki maas alanı + SUM kadar arttıracak...

ben şöyle birşeyler çıkardım ama multi rows gibi bir hata veriyor...

Kod: Tümünü seç

update A set
A.MAAS =A.MAAS +(select sum(pr.P_ODEME) from PRIM pr where pr.P_SICIL between :ilk_sicil and :son_sicil group by pr.P_SICIL)
where A.PSICIL between :ilk_sicil and :son_sicil;

acaba bu toplu update işini nasıl çözebilirim... teşşekkürler..
;)
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
select sum(pr.P_ODEME) from PRIM pr where pr.P_SICIL between :ilk_sicil and :son_sicil group by pr.P_SICIL
sql i multirow neden oluyor. bunu

Kod: Tümünü seç

select sum(pr.P_ODEME) from PRIM pr where pr.P_SICIL=A.sicil group by pr.P_SICIL
yaparsan düzelmesi lazım.
Kolay Gelsin.
Not: belki A.sicili almayabilir şuan deniyemiyorum ama problemin kaynağı belirttiğim gibi. ikinci selectte tek kayıt dönmüyor. beetween iki sicil numarası arasındaki tüm kayıtları getiriyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

kolon olarak bir subselect kullanıyorsanız buradan tek bir row dönmeli.. Bu nedenle query yi,

Kod: Tümünü seç

update A set A.MAAS =A.MAAS +
                  (select sum(pr.P_ODEME) 
                   FROM PRIM pr 
                   WHERE pr.P_SICIL between :ilk_sicil and :son_sicil)
WHERE A.PSICIL BETWEEN :ilk_sicil and :son_sicil;
şeklinde kullanmalısınız. İç query deki group by soruna neden oluyor.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

@aslangeri,@dogan hocam teşşekürler ...
Dogan hocam sizin göndermiş olduğunuz kodu denedim ;
betwen'e 1'den 2'ci sicile kadar yap dedim oda;

Kod: Tümünü seç

select sum(pr.P_ODEME) 
                   FROM PRIM pr 
                   WHERE pr.P_SICIL 1 and 2
SUM sonucu 1200

ve gitti A tablosundaki 1 ve 2 nolu sicil'in MAAS + 1200 olarak arttırdı..

hocam nasıl bir sorgu yapmalıyım ki verdiğim sicil aralığındaki kişilerin MAAS+PRIM leri kadar artsın...
;)
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

update A set A.MAAS =A.MAAS +
                  (select sum(pr.P_ODEME)
                   FROM PRIM pr
                   WHERE (pr.P_SICIL = A.PSICIL )
WHERE A.PSICIL BETWEEN :ilk_sicil and :son_sicil; 
seklinde olmalı sanki
ÜŞENME,ERTELEME,VAZGEÇME
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

@gkimirti hocam verdiginiz kod işimizi gordu tesekkurler.
;)
Cevapla