İsim verilen alanı kullanmak

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ı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

İsim verilen alanı kullanmak

Mesaj gönderen pentiumkivanc »

Selamlar;
Ben sorgu sırasında isim verdiğim bir alanı daha sonra where ile filtrelemede kullanmak istiyorum ancak 'Invalid column name <kolonadı> ' hatası alıyorum.
Sorgu basitleştirilmiş haliyle şöyle:

Kod: Tümünü seç

SELECT Malkodu, Serino, kod4,
SUM(case when tarih<'27/08/2004' then case IslemTur when 0 then case IslemTip when 4 then KOD13 else 0 end else 0 end else 0 end) as DvCuval From tablo.STI
Gibi.. Burada DvCuval benim verdiğim isim bu sorgu normalde çalışan bir sorgu. Ama bunun sonuna

Where (DvCuval<>0) ekleyince kolon adının bulunamadığını söylüyor. Tabi ki gerçekte DvCuval diye bir kolon yok. O benim sorgumun neticesinde gelen bir işlem. DvCuval, Delphide rapor aldırırken, üstünde işlem yaparken bir field gibi davranıyor. Ama where içinde kullanamıyorum. (Tabi yukarıdaki sorgunun sonuna ekleyince.

Benim sorum şu: Yukarıdaki gibi hatta daha karmaşık bir sorguda DvCuval gibi 10-11 tane alanı hesaplatıyorum ve bunların hepsine as ile isim veriyorum. Normalde yukarıdaki gibi sadece toplam filan aldırsam sorun yok ama isim verdiğim bu alanların (DvCuval) gibi 0 (sıfır) dan farklı olanlarının gelmesini istediğimde bunu yukarıdaki gibi where ile yapamıyorum. Invalid column name hatası alıyorum. Bu sorunu tek sorgunun içinde aşmanın bir yolu varmı?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Veribanı olarak ne kullanıyorsunuz? SQL Server'da maalesef böyle birşey yok :( ama firebirdde varmış diye hatırlıyorum. Ama kodunuzdan anladığım kadarı ile şunu yapmanız işinizi görecektir:

Kod: Tümünü seç

SELECT Malkodu, Serino, kod4, KOD13 as DvCuval
Where (tarih<'27/08/2004') and (IslemTur=0) and (IslemTip=4)
Nasılsa where e yazdığım bu durumların dışında DvCuvar'ın değeri KOD13 yerine 0 döndürmesini istiyor, 0 ları da görmek istemiyorsanız where e yazmanız yeterli.

Yani benim sizin case inizden anladığım bu.. :roll:
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

arkadas muhtemelen firebird kullanıyor.
en kestirme yoldan bu ifadeyi bir sp yapalım
sanki Malkodu, Serino, kod4, DvCuval alanlarına sahip bir tablo gibim istedigin sekilde at kosturabilirsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Maalesef SQL server kullanıyorum. (kullanmak zorundayım),
DvCuval diye hesaplatılan bu alan Kod13 isimli gerçek alanın belirli şartlar altındaki toplamlarından oluşuyor ve eğer işlemtipi 4 den işlemturu de 0 dan farklıysa 0 değerini döndürmesini istiyorum. when ile kullanmamın sebebi buydu ve benim DvCuval gibi yaklaşık 10 tane daha aynı sorgu içinde hesaplattığım değer var. sonuçta DvCuval,DvPalet,DvMiktar,DvFason, UretilenCuval,UretilenFason,UretilenMiktar,UretilenPalet v.s gibi değerleri tek sorguda çıkartmak zorundayım. Ama çıkan sorguda Eğer hesaplanan bu değerlerin tümü 0 olursa sorgu neticesinde gelmemesini istiyorum yani DvCuval=0 ve Dvpalet=0 olursa gösterilmemeli ama Invalid Column name (dvcuval) hatası alıyorum. Çünkü Dvcuval gerçekte yok benim oluşturduğum bir işlem. o yüzden ayrı ayrı select kullanamıyorum.

Aslında kodun tamamı şöyle

Kod: Tümünü seç

SELECT Malkodu, Serino, kod4,
SUM(case when tarih<38180 then
case IslemTur when 0 then case IslemTip when 4 then KOD13 else 0 end else 0 end 
else 0 end)
-
SUM(case when tarih<38180 then
case IslemTur when 1 then case IslemTip when 1 then KOD13 else 0 end else 0 end 
else 0 end) as DvCuval,

SUM(case when tarih<38180 then
case IslemTur when 0 then case IslemTip when 4 then KOD14 else 0 end else 0 end 
else 0 end)
-
SUM(case when tarih<38180 then
case IslemTur when 1 then case IslemTip when 1 then KOD14 else 0 end else 0 end 
else 0 end) as DvPalet,

SUM(case when tarih<38180 then
case IslemTur when 0 then case IslemTip when 4 then Miktar else 0 end else 0 end 
else 0 end)
-
SUM(case when tarih<38180 then
case IslemTur when 1 then case IslemTip when 1 then Miktar else 0 end else 0 end 
else 0 end) as DvKG,

SUM(case when tarih<38180 then
case IslemTur when 0 then case IslemTip when 5 then Miktar else 0 end else 0 end 
else 0 end)
-
SUM(case when tarih<38180 then
case IslemTur when 1 then case IslemTip when 5 then Miktar else 0 end else 0 end 
else 0 end) as DvFason,

SUM(case when tarih=38180 then
case IslemTur when 0 then case IslemTip when 4 then KOD13 else 0 end else 0 end 
else 0 end) as UrCuval,
SUM(case when tarih=38180 then
case IslemTur when 0 then case Islemtip when 4 then KOD14 else 0 end else 0 end
else 0 end) AS UrPALET,
SUM(case when tarih=38180 then
case IslemTur when 0 then case IslemTip when 4 then MiKTAR else 0 end else 0 end
else 0 end) AS UrKG, 
SUM(case when tarih=38180 then
case IslemTur when 0 then case IslemTip when 5 then miktar else 0 end else 0 end
else 0 end) as UrFason, 
SUM(case when tarih=38180 then 
case IslemTur when 1 then case IslemTip when 1 then KOD13 else 0 end else 0 end
else 0 end) as CkCuval,
SUM(case when tarih=38180 then
case IslemTur when 1 then case IslemTip when 1 then KOD14 else 0 end else 0 end
else 0 end) as CkPalet,
SUM(case when tarih=38180 then 
case IslemTur when 1 then case IslemTip when 1 then Miktar else 0 end else 0 end
else 0 end) as CkKG,
SUM(case when tarih=38180 then
case IslemTur when 1 then case IslemTip when 5 then Miktar else 0 end else 0 end
else 0 end) as CkFason
FROM FINSAT3UN.STI 
GROUP BY Malkodu,  Serino,kod4
ORDER BY MALKODU
işte bunun sonuna (group by dan önce mesela,
where ((dvCuval<>0) or (dvpalet<>0) or .....) gibi bir filtre koyunca bahsi geçen hatayı alıyorum.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bence bukadar case i cümlende kullanma. Ya bir view oluştur, sonra o viewden istediğin alana göre sorgularsın. Ya da bi table oluştur. Bir stored procedure ile tablona bu değerleri yaz. Ve ordan istediğin sorguları yap.
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Yani anladığım kadarıyla yukarıdaki sorguda 0 gelen alanları filtreleyemem. Peki siz Hafızada geçici olarak kalan tabloları (galiba memory table) mı kastediyorsunuz? Peki buradaki sorguyu bir memtable a aktarabilirmiyim? birde bu aktarım işi sorgunun uzunluğundan dolayı fazla zaman alırmı?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Hayır ben memory table ı kastetmedim normal kendi istediğin alanlardan oluşan bir table oluşurmanı kastetmiştim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
ilk mesajınızdaki
Where (DvCuval<>0) ekleyince...
dvcuval ın önüne : koyarak deneyebilirmisiniz.
Kolay gelsin
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Incorrect syntax near ':' hatası aldım. Ama sorun değil. Naile nin dediği gibi view kullanarak ilk önce verileri bir view de toplattım. Alanları orada oluşturdu. Daha sonra where ile view den sorgulama yaptırdım. Aslını sorarsanız sorgu fazla olduğu için yavaşlamasından korkuyordum ama pek fazla bir yavaşlama olmuyor.
Cevapla