Nasıl Bir Sql Yazmalıyım?

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
Kullanıcı avatarı
yamanyazılım
Üye
Mesajlar: 7
Kayıt: 24 Ara 2004 01:45

Nasıl Bir Sql Yazmalıyım?

Mesaj gönderen yamanyazılım »

Merhaba, öncelikle tüm emeği geçenlere teşekkürü borç bilirim, şimdiye kadar gördüğüm en güzel delphi forumu burasıdır. Benim sorunum şu şekilde

Bir tablom var alanlar şu şekilde

Kod: Tümünü seç

PERS_ID INTEGER,
     TCKIMLIKNO VARCHAR (16),
    SICILNO VARCHAR (16),
    ADI VARCHAR (20),
    SOYADI VARCHAR (20),
    BABAADI VARCHAR (20),
    CINSIYET VARCHAR (1),
    UYRUGU VARCHAR (15),
    DOGUMYER VARCHAR (20),
    DOGUMTAR DATE,
    IKAMADRES VARCHAR (35),
    IKAMADRES2 VARCHAR (35),
    IKAMADRES3 VARCHAR (35),
    POSTAKOD VARCHAR (6),
    EVTEL VARCHAR (11),
    CEPTEL VARCHAR (11),
    OGRENIM VARCHAR (15),
    ISEGIRISTAR DATE,
    IZINGUNSAY INTEGER,
    YAZDIR SMALLINT,
    POGS1 SMALLINT,
    POGS2 SMALLINT,
    POGS3 SMALLINT,
    POGS4 SMALLINT,
    POGS5 SMALLINT,
    POGS6 SMALLINT,
    POGS7 SMALLINT,
    POGS8 SMALLINT,
    POGS9 SMALLINT,
    POGS10 SMALLINT,
    POGS11 SMALLINT,
    POGS12 SMALLINT,
    ISTIHDAMDRM VARCHAR (10),
    SICIL VARCHAR (16))
Şimdi bu tablodan şöyle bir veriye ihtiyacım var
Buradaki POGS alanının yanındaki rakamlar ayları ifade ediyor,Her bir sigortalı için prim ödeme gün sayıları bunlar. Öyle bir sorgu yazmalıyım ki örneğin ocak ayında bu sorguyu çağırdığımızda ocak dahil olmak üzere geriye doğru toplam en az 120 gün tutana kadar bana kayıtları seçsin. Bir örnek vereyim
kişi 12. Ayda:30 gün
11. Ayda:30 gün
10. Ayda:28 gün
09. Ayda:28 gün
08. Ayda:30 gün primi ödenmiş olsun sorguyu bu ay için yaptığımızda dönecek sonuç şu olmalı(her kişi için)
sicilno adı soyadı ................ POGS12 POGS11 POGS10 POGS09 POGS08
------- ---- ------- --------- -------- --------- -------- --------
12345 ahmet ak 30 30 28 28 30

yani eğer 10. ve 9. ayda 30 gün olsaydı bana pogs08 i vermesin

kullandığım veritabanı interbase
ben stored procedure ile olabileceğini düşünüyorum ama sayısız denemem sonuçsuz kaldı, farklı bir bakış açısına ihtiyacım var.
herkese saygılarımla..
onaydin

Mesaj gönderen onaydin »

Merhaba,
Sorunuza cevap aramaya başlamadan önce sanki tasarımda bir eksiklik var gibime geliyor.
Mesela 2004 için ay-prim tutarlarını girdik
2005 için ne yapacağız, onları nerede tutacağız.
Onlar ayrı bir tabloda tutulsa nasıl olur
Mesela;

PERS_POGS tablosu
PERS_POGS_ID,
PERS_ID,
YIL,
AY

bu alanlardan oluşsun gibi.
Kullanıcı avatarı
yamanyazılım
Üye
Mesajlar: 7
Kayıt: 24 Ara 2004 01:45

Mesaj gönderen yamanyazılım »

Merhaba
Aslında aynı şeyi bende düşündüm ve ayrıca bir tablo da bunun için yaptım

Kod: Tümünü seç

POGS_ID
PERS_ID
YIL
AY
KAZANC
POGS
Fakat inanın aklım durdu,çok zor birşey olmadığını biliyorum ama kaldı ki insan bazen öyle basit şeyleri görmemekte diretiyor ki inanması güç :wink:
onaydin

Mesaj gönderen onaydin »

Tamam
Cevabı Firebird geçerli olacak şekilde yazdım,
interbase de case ifadesi desteklenmiyorsa onda deneyebilirsiniz

Denediğim tablo, burda yıl kısmı eksik onu ekleyip, sorguyada yıl kısmını eklersiniz.

Kod: Tümünü seç

CREATE TABLE T_POGS (
    POGS_ID   INTEGER,
    SICIL_NO  INTEGER,
    AY        INTEGER,
    TUTAR     INTEGER
);
Procedure le de olabilirdi ama ben select le denedim,

Kod: Tümünü seç

select SICIL_NO,
sum(case ay when 12 THEN tutar end) as ARALIK,
sum(case ay when 11 THEN tutar end) as KASIM,
sum(case ay when 10 THEN tutar end) as EKIM,
sum(case ay when 9 THEN tutar end) as EYLUL,
sum(case ay when 8 THEN tutar end) as AGUSTOS,
sum(case ay when 7 THEN tutar end) as TEMMUZ,
sum(case ay when 6 THEN tutar end) as HAZIRAN
from T_POGS TM
where POGS_ID in (
select POGS_ID
from T_POGS t where SICIL_NO = TM.SICIL_NO and
(select sum(TUTAR) from t_pogs s where s.sicil_NO=t.Sicil_no and s.ay >= t.ay) <= 120 )
group by TM.SICIL_NO
Burda diğer aylarıda ekleyebilirsiniz.
Eğer o ay gerekmiyorsa onu boş geçecek.
Kullanıcı avatarı
yamanyazılım
Üye
Mesajlar: 7
Kayıt: 24 Ara 2004 01:45

Mesaj gönderen yamanyazılım »

Merhabalar

onaydın cevabın için teşekkürler fakat case ifadesi interbase de sorun çıkardığı için bu sorguyu kullanamadım,
lakin firebird e geçme şansım yok çünkü yazılmış bir programa ek modül ekliyorum ve server a firebird
kuramıyorum. Ama sorunumu şu procedure ile çözdüm,merak edenler için

Kod: Tümünü seç

CREATE PROCEDURE SPS_DONEM (
    PERSONELID INTEGER)
RETURNS (
    TCKIMLIKNO VARCHAR (12),
    SICILNO VARCHAR (16),
    ADI VARCHAR (20),
    SOYADI VARCHAR (20),
    BABAADI VARCHAR (20),
    CINSIYET VARCHAR (1),
    UYRUGU VARCHAR (15),
    DOGUMYER VARCHAR (20),
    DOGUMTAR DATE,
    IKAMADRES VARCHAR (35),
    IKAMADRES2 VARCHAR (35),
    IKAMADRES3 VARCHAR (35),
    POSTAKOD VARCHAR (6),
    EVTEL VARCHAR (11),
    CEPTEL VARCHAR (11),
    OGRENIM VARCHAR (15),
    ISEGIRISTAR DATE,
    IZINGUNSAY INTEGER,
    YAZDIR SMALLINT,
    ISTIHDAMDRM VARCHAR (10),
    SICIL VARCHAR (16),
    YIL SMALLINT,
    AY SMALLINT,
    KAZANC FLOAT,
    POGS SMALLINT,
    DONEM VARCHAR (23))
AS
declare variable toplam integer;
BEGIN
  /* Procedure body */
toplam=0;
for
select
personel.tckimlikno,
PERSONEL.sicilno,personel.adi,PERSONEL.soyadi,
PERSONEL.babaadi,personel.cinsiyet,personel.uyrugu,
PERSONEL.dogumyer,personel.dogumtar,personel.ikamadres,
PERSONEL.ikamadres2,PERSONEL.ikamadres3,personel.postakod,
personel.evtel,personel.ceptel,personel.ogrenim,personel.isegiristar,
personel.izingunsay,PERSONEL.yazdir,PERSONEL.istihdamdrm,
PERSONEL.sicil,pogs.yil,pogs.ay,pogs.pogs,pogs.kazanc,
donem.donem
from personel,pogs,donem
where pogs.pers_id=1327 and
personel.pers_id=pogs.pers_id and
pogs.ay=donem.ay
order by pogs.yil desc,pogs.ay desc
into
:TCKIMLIKNO ,
:SICILNO ,
:ADI ,
:SOYADI ,
:BABAADI ,
:CINSIYET ,
:UYRUGU ,
:DOGUMYER ,
:DOGUMTAR,
:IKAMADRES ,
:IKAMADRES2 ,
:IKAMADRES3 ,
:POSTAKOD ,
:EVTEL ,
:CEPTEL ,
:OGRENIM ,
:ISEGIRISTAR ,
:IZINGUNSAY ,
:YAZDIR ,
:ISTIHDAMDRM ,
:SICIL,
:YIL,
:AY,
:POGS,
:KAZANC,
:DONEM do
begin
toplam=toplam+pogs;
SUSPEND;
while ((toplam>=120) and (toplam<150)) do
exit;

end
  
END
burada bir eksiğim şudur, verdiğim tarihten nasıl başlatacağımı bilmiyorum yani
ben parametre olarak yıl = 2004 ve ay = 8 verdiğimde 8. ay dahil geriye
nasıl çalıştıracağımı bulamadım, çalışıyorum. Herkese selam ve sevgiler.
bir not:bu foruma kaydolana kadar stored procedure yazmayı bilmiyordum,burası özel ders gibi :)
Misafir

HOŞBULDUK

Mesaj gönderen Misafir »

ARKADAŞLAR
ANLADIĞIM KADARIYLA SQL SORGULAMA TİPLERİMİZ FARKLI
BELKİ YARDIMCI OLABİLİRİM AMA BİRİ BANA ARKADAŞAN PROBLEMİNİ AÇIKÇA SÖYLEYEBİLİR Mİ;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

@denizuzun forum kurallarına dikkat edelim. Mesajınızı edit edip tekrar düzenleyebilirsin

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla