Sql Sorgusunda ki problem

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Sql Sorgusunda ki problem

Mesaj gönderen conari »

Problem nerdedir arkadaşlar.??

Kod: Tümünü seç

SELECT TBLSTHAR.stok_kodu,
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)A
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < (GETDATE()-1) ) AS TOPLAM
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)B
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < GETDATE())AS TOPLAM2
from tblsthar
group by TBLSTHAR.stok_kodU,TBLSTHAR.DEPO_KODU,tblsthar.sthar_TARIH
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

1. TOPLAM ile TOPLAM2 nin arasında virgün yok
2. TOPLAM sütununu döndüren cümlede FROM Tablo yok
3. TOPLAM2 sütununu döndüren cümlede FROM Tablo yok
4. Bir de problem nerdedir diye sormadan önce şöyle bir hata alıyorum dersen önce soruyu anlamak için uğraşmak zorunda kalmayız.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Kusura bakma acil olduğu için virgülleri burda koymadan atmışım.

ama from ları her iki alana da eklediğim de hata alıyorum

Kod: Tümünü seç

SELECT TBLSTHAR.stok_kodu, 
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)A 
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < (GETDATE()-1) ) AS TOPLAM FROM TBLSTHAR,
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)B 
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < GETDATE())AS TOPLAM2 FROM TBLSTHAR
group by TBLSTHAR.stok_kodU,TBLSTHAR.DEPO_KODU,tblsthar.sthar_TARIH
hata.----
Server: Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'FROM'.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
kullandığınız VT SubQuery özelliğini destekliyormu hangi VT yi kullanıyorsunuz?
Volkan KAMADAN
www.polisoft.com.tr
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

where'ler yanlış kullanılmış.

Syntax'ını okunabilir bir şekilde ve de hizalayarak yazmaya geyret edin. O zaman hatalar zaten sırıtacaktır.

Basit bir Sub Select kullanımı şu şekildedir:

Kod: Tümünü seç

SELECT
  T1.KOD,
  (SELECT T2.ADI FROM ADLAR T2 WHERE T2.KOD = T1.KOD) AS ADI,
  (SELECT T3.SOYADI FROM SOYADLAR T3 WHERE T3.KOD = T1.KOD) AS SOYADI
FROM KODLAR T1
WHERE T1.KOD > 25
İyi çalışmalar.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Veritabanım MS SQLserver 2000 olduğu için bura ya yazdım .Daha önce bu şekilde çalışan querylerim mevcut..
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Bu hatayı neden alırım acaba.

Kod: Tümünü seç

Server: Msg 8124, Level 16, State 1, Line 1
Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then that outer reference must be the only column referenced in the expression.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bu hatayı aldığın cümleni yazar mısın? subqueryde birden fazla alan mı çağırmaya çalışıyorson?
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Aslında yapmak istediğimi anlatayım tblsthar tablosunda stok hareketleri tutuluyor. Bu tabloda depo_kodu=11 olan hareketlerin toplamı sonucunda bakiyesi nu bulmaya çalışacağım.

stok kodu ,Bakiye dün,bakiye bugün şeklinde

Tarihi getdate ile küçük ve eşit şeklinde iki ayrı şekilde kısıt vermem lazım
giriş çıkış olduğu sthar_gckod alanının g,c değerleri ile belli oluyor.miktar alanı da sthar_gcmik fieldında tutuluyor.

Hatayı burda alıyorum

Kod: Tümünü seç

SELECT TBLSTHAR.stok_kodu, 
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)A 
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < (GETDATE()-1) ) AS TOPLAM ,
(SELECT sum(case TBLSTHAR.STHAR_gckod when 'G' then TBLSTHAR.STHAR_GCmik else -1 * TBLSTHAR.STHAR_GCmik end)B 
 where TBLSTHAR.DEPO_KODU=11 AND 
 tblsthar.sthar_TARIH < GETDATE())AS TOPLAM2 
from tblsthar 
group by TBLSTHAR.stok_kodu,TBLSTHAR.DEPO_KODU,tblsthar.sthar_tarih
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Veritabanı güzel düzenlenmemiş ki bu sıkıntıları yaşıyorsunuz. Bu tür durumlarda, Giren hanesi ile Çıkan hanesi ayrı alanlarda tutarsanız, raporlarda fazla sıkıntı yaşamazsınız.

Bir tavsiye daha, GETDATE()'i kullandığınızda sonuç olarak size DATE ve TIME olarak geri döner. Sadece DATE kullanmak isterseniz DATEPART ile veya, gelen DATETIME bilgisini önce DOUBLE veya FLOAT'a çevireceksiniz, sonrasında da ROUND fonksiyonunun TRUNCATE işlemini kullanarak DATE'i elde edebilirsiniz.

Veya daha kısa yollu bir şey uygulayabilirsiniz.

Query'nizde dönen hata ise aslında GROUP BY yaptığınızda, SQL yorumlayıcıları, Query'lerin içinde geçen FIELD'ları (Doğrudan işe yaramasa bile) WHERE Koşulunda geçtiğinde, SELECT'in kendinde de istiyor. Oraya koyduğunuzda da bu sefer GROUP BY'da istiyor.

Tek Query'de almak yerine Ard arda ekilecek iki Query sonuçlarını bir TEMP tabloya atın, ve 3. SELECT cümlesinde de bu TEMP tablodan sonucu döndürün.

Süre olarak çok da farketmeyecektir, (Umarım milyon düzeylerinde kaydınız yoktur, yoksa farkeder :lol: :lol: :lol: :lol: :lol: )

Neyse Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kuri_YJ yazdı:Tek Query'de almak yerine Ard arda ekilecek iki Query sonuçlarını bir TEMP tabloya atın, ve 3. SELECT cümlesinde de bu TEMP tablodan sonucu döndürün.

Süre olarak çok da farketmeyecektir, (Umarım milyon düzeylerinde kaydınız yoktur, yoksa farkeder :lol: :lol: :lol: :lol: :lol: )

Neyse Kolay Gelsin
MS-SQL'de Derived Tables diye bir olay var (FireBird 2.0'da da var) ki bu sayede dediğiniz TEMP tablo kullanımına gerek kalmıyor ve tek query ile çok güzel ve hızlı bir şekilde istediğinizi yapabiliyorsunuz.

İyi çalışmalar.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Sadece tarih bilgisi döndürmek isterseniz CURDATE kullanabilirsiniz:
kullanımı:

Kod: Tümünü seç

{ fn CURDATE() }
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

GETDATE ile sadece dünun bakiyesini alabiliyorum problem olmuyor.


ama iç içe select kullandığımda alıyorum bu hata yı. Ayrıca bu database bana ait değil. Türkiyede çok kulllanılan bir Tic.pak.programın database, zaten programı bilen varsa table yapısından anlıyabilir.

Milyon olmasa bile yaklaşık 200.000(hatta hemen baktım kaç kayıt var diye 156 bin şuan ) vardır table de kayıt. sonucta stok tablosu olduğu için üretim satış depo transferi hepsini içeriyor.

yaklaşıkta 2500-3000 civarı stok var.hammadde yarı mamül mamül.tic mal v.s.
Bu sql cümlesini deplhi de kullanmayacağım sadece bir view olacak

Sonuç

stok_kodu,Bakiye dün,bakiye bu gün şeklinde bir view oluşturmam lazım.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

naile yazdı:Sadece tarih bilgisi döndürmek isterseniz CURDATE kullanabilirsiniz:
kullanımı:

Kod: Tümünü seç

{ fn CURDATE() }
Hocam MS-SQL'de CURDATE olduğuna emin misiniz?

İyi çalışmalar.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Evet ben şuanda 2000 ve 2005 de kullanıyorum. 7 için mi yok acaba?
Cevapla