sql

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

sql

Mesaj gönderen Vital »

merhaba ustalar
soyle bir sorunum var
giris ve cikis adinda iki tablom var
giris teki miktari toplayacak cikistaki miktari toplayacak ve birbirinden cıkararak kalanı bulacacak fakat bunu parcaadina gore yapacak ve istenilen tarih aralıgında yapabilecek urunadina gore gruplayacak takildigim yer giristeki a parcasini toplayacak ve cikistaki a parcasini toplayip birbirinden cikaracak fakat ayni parca oldugunu nerden bilecek giris.urunadi=cikisurunadi seklinde birsey yazdim hata veriyor belkide yerini yanlis yaptim tarihtete ayni sekilde hata veriyor
select(' select urunadi,urunkodu (select sum(miktari) from giris)-(select(sum(miktari) from cikis) from giris,cikis where tarih between ''' +edit1.text+ ''' and ''' + edit2.text+ '''' group by giris.urunadi');

nerde hata yapiyorum.
tskler.
Garibanus
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: sql

Mesaj gönderen conari »

Sql ile ilgili sorular vt ne ise onun bölümünde sorsan daha sağlıklı olur.
MSSQL, Oracle veya diğer vtler.

soruna gelince,
Bu eşitlemeye yapabilmeniz için iki tablodaki kodları eşitlemeniz lazım.
Birinci seçenek aşağıdaki gibi bir sorgu.

Kod: Tümünü seç

select gtablo.urunadi, gtablo.urunkodu sum(gtablo.miktari) - sum(ctablo.miktari) from gtablo,ctablo where  gtablo.urunkodu=ctablo.urunkodu and  gtablo.tarih between ''' +edit1.text+ ''' and ''' + edit2.text+ '''' and ctablo.tarih between ''' +edit1.text+ ''' and ''' + edit2.text+ '''' group by gtablo.urunadi, gtablo.urunkodu;
İkinci Join yapıları, forumda örnekleri çok.
Üçüncü, Union kullanarak
vt ne bilmiyorum ama yukarıda verdiğim örnek genelde tüm vtler de kullanılabilir.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

tskler conari
d7 fb kullaniyorum

senin kodlarini su sekilde duzenledim istedigimi kismen yapiyor

IBQuery1.SQL.Add('select giris.urunadi, giris.urunkodu , sum(giris.miktariadeti) - sum(cikis.miktariadeti) from giris,cikis where giris.urunkodu=cikis.urunkodu and giris.tarih between ''' +edit1.text+ ''' and ''' + edit2.text+ ''' and cikis.tarih between ''' +edit1.text+ ''' and ''' + edit2.text+ ''' group by giris.urunadi,giris.urunkodu ');

1-giris tablosunda olan bir parcanin cikis tablosunda cikis yapilmamissa gostermeyecektir burada sanirim bunu nasil asacagiz yani cikisi hic yapilmamis o halde giris adeti-0=girisadeti olmali
2-ve yapmak istedigim su belirtilen tarihler arasinda girismiktari-cikismiktari ne kadar stogu oldugunu gormek burada kafami karistiran tarihi girise goremi cikisa goremi alacagim ki o tarihler arasindaki stogu bulayim.
3-yukaridaki sorgu sonucu soyle birsey cikiyor
giris_table

urunadi urunkodu miktari
a 1 10
b 2 123
a 1 2


cikis_table

urunadi urunkodu miktari
a 1 10
b 2 2


sonuc olarak

a 1 10
b 2 121

olmasi gerekiyor fakat

a 1 -8
b 2 121

seklinde gosteriyor
bu kodu da denedim yine ayni sonuc
ibquery1.sql.add('SELECT giris.urunadi sum(giris.miktariadeti)-sum(cikis.miktariadeti) from giris,cikis where giris.urunadi=cikis.urunadi and giris.tarih='''+edit1.Text+'''and cikis.tarih='''+edit1.Text+'''');
tskler.
Garibanus
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: sql

Mesaj gönderen conari »

Fb için tam bir şey diyemeyeceğim ama, çıkış tablondaki isim ve kod alanlarınıda group by a eklemen gerekebilir.

Onun dışında INNER, LEFT, RIGHT join sorgulamalarına bak. Öğrenmen hazır kodu kullanmandan daha faydalı olacaktır.

Diğer bir alternatif. bir view hazırla ve iki tabloyu tamamı ile birleştir. Farklı bir field olarak, G,C stringini ekle.
Sorgunu burdan şekersin. :wink:
En son conari tarafından 18 Nis 2008 03:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

sagol conari fakat denedim ama hepsi ayni sonuc su -8 i neden verdi onu cikaramadim

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

Re: sql

Mesaj gönderen conari »

Çekersin olacaktı şekersin kalmış. :D Özür dilerim.

En son alternatif kesin işini görür.Union ile iki tabloyu birleştirerek select et.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

hadi ya hic farketmedim kardes hehe :) korle yatan sasi kalkar ehuhuh
Garibanus
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

ustalar bi el atsaniz hesaplamayi neden yanlis yapiyor cozemedim her yoluı denedim bi sonuca varamadim
yukaridaki kod bir urun icin istedigimi yapiyor ama digeri icin hatali sonuc uretiyor
ayri ayri sorgu yaptim dogru hesapliyor fakat birlestirince yanlis sonuc veriyor.
hata nerde acaba?

tskler.
Garibanus
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: sql

Mesaj gönderen aLonE CoDeR »

Bunun için stored procedure yazman en sağlıklı çözüm olur. İşlemleri parça parça tamamlayarak tek row halinde sonuç alabilirsin.

Not : Konuyu @conari'nin değindiği gibi veritabanı forumuna açsan ve başlığına da daha açıklayıcı bir ifade yazsan daha yerinde olurdu.

Kolay gele.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: sql

Mesaj gönderen unicorn64 »

giriş tablosuyla çıkış tablosunun yapısı(alanları) aynı mı?
eğer öyleyse neden iki ayrı tablo olsun ki, gc_kod die bi nvarchar(1) işini görür.

sonrada

örneğin bakiyeyi almak için

Kod: Tümünü seç

select urunkodu,sum ((case when gc_kod='G' then miktari else 0 end)-(case when gc_kod='C' then miktari else 0 end)) as bakiye from giriscikis group by urunkodu
denebilir...
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
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

evet alanlar ayni arkadaslar fakat 2 ayri table(giris,cikis) olsa hem table lar sismez hemde ileride eger bir donusum icin daha avantajlı olabilir diye dusundum(sp,trigger) diger bir yontem evet ama sql ile neden olmuyor hayret aslinda oluyor ama kismen hesaplamayi yanlis veriyor.veya soyle yapsam tablolari ayri querylerle(veya ayni query ile )hesaplatip degiskenlere atsam sonra birbirinden cikarsam nasil olur ama bu seferde tum urunleri nasil gostericem(sanirim dizilerle ugrasmam gerek).

unicorn64 eger tek tabloda yapsam verdigin kodu biraz daha acabilirmisin case ve else kullanmissin ('G') vs?

tskler.
Garibanus
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: sql

Mesaj gönderen unicorn64 »

case şarta göre sorgu oluşturmaya yarıyor.
tabloda gc_kod diye bir alan olsun ve giriş haraketi için 'G' çıkış hareketi için 'C' yazalım bu alana.

(case when gc_kod='G' then miktari else 0 end) -> gc_kod 'G' ise miktarı al değilse 0 al
(case when gc_kod='C' then miktari else 0 end) -> gc_kod 'C' ise miktarı al değilse 0 al


sum içinde toplanacak değer her bir kayıt için girişse pozitif çıkışsa negatif olmuş olur. daha sonra bunların toplamı da bakiyeyi verir...
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
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

evet unicorn guzel ve degisik bir yontem tskler fakat var diger query yontemini kullanmak istiyorum(veya trigger) fakat bu sorgu neden yanlis sonuc verdi onu anlayamadim hadi bu sefer hallederiz ama yanlisin nerede oldugunu bulmak gerekiyor olmadi birak gibi biraz tuhaf geliyor bana ,
tekrar tskler.
Garibanus
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sql

Mesaj gönderen Vital »

araba yolda kaldi ustalar modlar bi el atsa arkadaslar

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

Re: sql

Mesaj gönderen conari »

Stoklar için sabit bir tablon var ise , kodları ve isimleri burdan select et. giriş ve çıkışları diğer iki tablodan bu sayede gelmeyen kayıtlarında gelir.
Ayrıca Union dene demiştim işine yaraması lazımdı.

Ama iki tabloyu birleştirmen en sağlıklısıdır.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla