Sql de şartlı değişken tanımlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Sql de şartlı değişken tanımlama

Mesaj gönderen lom »

s.a kolay gelsin arkadaşlar. 2 ayrı tablom var , bu tabloları birleştirerek kalan stoğu göstermem gerekiyor.

Kod: Tümünü seç

SELECT
URUN.URUNADI,
KALAN=(SELECT SUM(MIKTAR) FROM STOK WHERE TURU=GIRIS AND STOK.URUN_ID=URUN.URUN_ID)-(SELECT SUM(MIKTAR) FROM STOK WHERE TURU=CIKIS AND STOK.URUN_ID=URUN.URUN_ID)
FROM
URUN order by URUN.URUNADI
aslında sorgu bu şekilde çalışıyor ancak herhangi bir üründen çıkış olmadığı zaman sadece giriş olduğu zaman sonucu NULL olarak gönderiyor. Diyeceğim şu : stokta o ürüne ait çıkış yoksa 0 değerini nasıl gönderebilirim. Teşekkürler kolay gelsin.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen unicorn64 »

Kod: Tümünü seç

SELECT
URUN.URUNADI,
KALAN=(SELECT ISNULL(SUM(MIKTAR),0) FROM STOK WHERE TURU=GIRIS AND STOK.URUN_ID=URUN.URUN_ID)-(SELECT ISNULL(SUM(MIKTAR),0) FROM STOK WHERE TURU=CIKIS AND STOK.URUN_ID=URUN.URUN_ID)
FROM
URUN order by URUN.URUNADI
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen lom »

Hocam imdadıma iyi yetiştiniz :P , bende forumu biraz kurcaladım şöle bir şey yaptım :P

Kod: Tümünü seç

SELECT
URUN.URUNADI,
case 
when (SELECT COUNT(URUN_ID) FROM STOK WHERE TURU=CIKIS AND STOK.URUN_ID=URUN.URUN_ID)=0  then 
(SELECT SUM(MIKTAR) FROM STOK WHERE TURU=1 AND STOK.URUN_ID=URUN.URUN_ID)-0 

when (SELECT SUM(MIKTAR) FROM STOK WHERE TURU=CIKIS AND STOK.URUN_ID=URUN.URUN_ID)>0 then 
(SELECT SUM(MIKTAR) FROM STOK WHERE TURU=GIRIS AND STOK.URUN_ID=URUN.URUN_ID)-(SELECT SUM(MIKTAR) FROM STOK WHERE TURU=CIKIS AND STOK.URUN_ID=URUN.URUN_ID)
end
AS KALAN
FROM
URUN order by URUN.URUNADI
bu da aynı sonucu veriyo ama eminim yavaşlamaya sebep olacaktı. Teşekkürler
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen unicorn64 »

sanırım "URUN" de sabitler "STOK"ta hareketler kayıtlı.

Kod: Tümünü seç

SELECT
URUN.URUNADI, 
ISNULL(SUM(CASE WHEN TURU ='GIRIS' THEN MIKTAR WHEN TURU ='CIKIS' THEN -MIKTAR END),0) AS KALAN 
FROM
URUN LEFT OUTER JOIN STOK ON URUN.URUN_ID=STOK.URUN_ID
GROUP BY URUN.URUNADI
order by URUN.URUNADI
şeklinde daha sade bir sorgu olur sanırım.
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen conari »

Kod: Tümünü seç

KOD EKSİK TANIMLANMIŞ DOĞRUSU AŞAĞIDA
Bence hareket tablosundan çekersen daha iyi, hareketi olmayanlar gelmez daha hızlı rapor alırsın. isnulla da gerek kalmaz.
TURU Gibi alanlar içinde tek karakter kullanırsınız daha iyi 0 veya 1 yada G veya C gibi
En son conari tarafından 30 Oca 2009 05:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen unicorn64 »

@conari hocam haklısınız daha hızlı rapor alınır belki ama hareket kaydı olmayanlar gelmeyecektir bu şekilde, çok fazla ürün varsa da hareket görmemiş olanları (hareket görmediği için bakiyesi olmayanları) görmek sıkıntı olacaktır.
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen lom »

conari yazdı:

Kod: Tümünü seç

SELECT
URUN.URUNADI, 
SUM(CASE WHEN TURU ='GIRIS' THEN MIKTAR else -MIKTAR END) AS BAKIYE 
FROM STOK
INNER JOIN URUN ON (URUN.URUN_ID=STOK.URUN_ID)
GROUP BY stok.URUN_ID
order by stok.URUN_ID
Bence hareket tablosundan çekersen daha iyi, hareketi olmayanlar gelmez daha hızlı rapor alırsın. isnulla da gerek kalmaz.
TURU Gibi alanlar içinde tek karakter kullanırsınız daha iyi 0 veya 1 yada G veya C gibi
@conari hocam dediğiniz gibi turu alanını bit olarak ayarladım. Giriş yerine 1 , çıkış yerine de 0 yaptım. Verdiğiniz sql'i uygulamaya çalıştım ancak şöle bir hata verdi ??

Kod: Tümünü seç

SELECT
URUN.URUNADI, 
SUM(CASE WHEN TURU =0 THEN MIKTAR else -MIKTAR END) AS BAKIYE 
FROM STOK
INNER JOIN URUN ON (URUN.URUN_ID=STOK.URUN_ID)
GROUP BY stok.URUN_ID
order by stok.URUN_ID

Kod: Tümünü seç

Column 'URUN.URUNADI' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Group by da ne gruplamış isek onu SELECT kısmında yazmamız gerekiyo zaten heralde gözünüzden kaçmış. Select kısmını da URUN.URUN_ID olarak belirlediğimde de aynı hatayı almaktayım.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen conari »

Kod: Tümünü seç

SELECT
STOK.URUN_ID,
URUN.URUNADI, ''sabit tablodan ismi getir.
SUM(CASE WHEN TURU =0 THEN MIKTAR else -MIKTAR END) AS BAKIYE 
FROM STOK ''Hareket tablosundan miktarı topla
INNER JOIN URUN ON (URUN.URUN_ID=STOK.URUN_ID) '' iki tabloyu birbirine ID ile bağla
GROUP BY STOK.URUN_ID, URUN.URUNADI '' sabit tablodaki ürün adına göre grupla
ORDER BY STOK.URUN_ID ''Hareket tablosundaki ID ye göre sırala 
Pardon ben Group BY ı değiştirmemişim. Bu şekilde çalışması lazım. selectte URUN _ID yi koymamışım.

Yine ek bir bilgi daha vereyim tablo isimlerini daha anlamlı vermeye çalışmalısın. Ben ilk bakınca URUN tablosu ile STOK tablosunun aynı olduğunu düşünürüm açıkçası çünkü ikiside hemen hemen aynı anlama geliyor.

master bilgilerin için URUNSABIT veya STOKSABIT
hareketler için URUNHAREKET veya STOKHAREKET gibi isimler kullansan daha anlaşılır olur.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Sql de şartlı değişken tanımlama

Mesaj gönderen conari »

unicorn64 yazdı:@conari hocam haklısınız daha hızlı rapor alınır belki ama hareket kaydı olmayanlar gelmeyecektir bu şekilde, çok fazla ürün varsa da hareket görmemiş olanları (hareket görmediği için bakiyesi olmayanları) görmek sıkıntı olacaktır.
Evet haklısın hareket tablosundaki ID yi select e eklemeyi unutmuşum. ilk cümlede zaten null kayıtlar döner çalışmazdı.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla