SQL Query sorgusunda çoklu SUM ve MINUS fonksiyonu

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Yardımcı olacak arkadaşlara şimdiden teşekkür etmek istiyorum. Bir çözüm yolu bulabilirsem büyük bir dertten kurtulmuş olacağım.
Malzeme stok hareketlerini yönettiğim, oldukça karmaşık formüller ve makrolar içeren bir excel dosyam var. Kayır sayısı arttıkça makroların içerisindeki for-next döngüleri, yavaşlama nedeniyle ihtiyacımı görmemeye başladı. For-Next döngüsü yerine SQL query ile bu işlemi yapmak daha mantıklı geldiği için tüm dosyaları çöpe göndermeyi göze aldım ancak istediğim sorguyu bir türlü düzenleyemedim. Aşağıdaki tablo (excel tablosu) üzerinde yer alan verilere göre hareket türüne bağlı olarak Lot bazında toplama işlemi yaparak Girişlerden Çıkışları düşmesi ve sonuç miktar sıfırdan büyükse listelemeli. (Bu hareketler yalnızca bir malzemeye ait olduğu için WHERE komutunu, WHERE ('Mazeme Kodu' =?) şeklinde kullanarak Malzeme Kodu için bir hücreyi referans gösteriyorum.)

Hareket Türü___Lot No______Miktar___Birim___Raf No
Giriş_________1904012_______100_____Kg_____B125
Çıkış_________1904012_______ 50_____ Kg_____B125
Çıkış_________1904012_______ 50 _____Kg_____B125
Giriş_________1905041_______250_____Kg_____B123
Çıkış_________1905041_______250_____Kg_____B123
Giriş_________1905041_______ 50 _____Kg_____B124
Giriş_________1905041_______300_____Kg_____A324
Çıkış_________1905041_______ 50 _____Kg_____B124
Giriş_________1906010_______250_____Kg_____A321
Çıkış_________1906010_______ 50 _____Kg_____A321
Çıkış_________1906010_______ 50 _____Kg_____A321
Çıkış_________1906010_______ 25 _____Kg_____A321
Çıkış_________1906010_______125_____Kg_____A321
Giriş_________1906016_______250_____Kg_____A223
Çıkış_________1906016_______ 25 _____Kg_____A223
Çıkış_________1906016_______225_____Kg_____A223
Giriş_________1906016_______100_____Kg_____A223
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,226
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,366
Excel Vers. ve Dili
Office 2013
Tam ben de bir sorgu hazırlamıştım..

SQL:
SELECT First((
(select sum(miktar) from tbl_lot where lot=bb.lot and hareket="giriş")
-
(select sum(miktar) from tbl_lot where lot=bb.lot and hareket="çıkış"))) AS kalan, 
bb.lot
FROM tbl_Lot AS bb
GROUP BY bb.lot
ORDER BY bb.lot;
Buna benzer bir sorguyla olur gibi son from dan sonra sabit where şartı kullanabilirsiniz. Uzun zamandır sorgu yazmamıştım ve çok ta verimli bir sorgu gibi gelmedi bana ;)

Ayrıca Zeki beyin dediği gibi databese nedir? Database göre yukarıdaki gibi alt sorgular yerine çok daha hızlı sonuç veren sorgular yazılabilir.
 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Cevaplar için teşekkürler, hemen deneyeceğim. Database sayılmaz, excel tablosu aslında. Önce ADO ile denedim, sonuç alamayınca veri bağlantı sihirbazı ile baglandım.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,332
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Örnek dosyanızı paylaşırsanız alternatif çözümler üretilebilir.
 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Kodları dosya isimlerine ve sütun başlıklarına göre tekrar düzenledim. Sonuç olarak tüm lot numaraları için aynı rakam yani 139924,9 dönüyor. Sanırım yapmayı istediğim şeyi tam olarak ifade edemedim, o yüzden tezat gibi görünüyor.

Giriş lot numarası ile 500 kg malzeme geldiğini ve bu malzemenin 250 kg Çıkış ile düştüğümüzü varsayarsak 500-250 = 250 Kg malzeme sonuçu çıkması gerekiyor. Aynı lot numarası ile 250 Kg daha çıkış yaptığımızda 500-250-250 = 0 Kg olması gerekiyor ve buradaki sıfır nedeniyle bu kayıt listede görünmemesi gerekiyor. Dosyayı stok ve FIFO takibi için kullanıyorum, aynı zamanda raf adreslemesi de yapıyor. Umarım bu defa daha anlaşılır ifadeler kullanmışımdır.

Dosyalara aşağıdaki linkten ulaşabilirsiniz.

https://files.fm/u/xga8tpgz
 
Son düzenleme:

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,366
Excel Vers. ve Dili
Office 2013
Örneğinizi incelemeden yazıyorum.. Tüm lotlar için aynı sonuç çıkıyorsa where şartları dikkate alınmıyor demektir. Yoksa sizin istediğinizi ben anladım ve her lot için (giriş-çıkış) toplamını tek satırda veriyordu. Sadece giriş-çıkış=0 için bir şart vermemiştim. İsterseniz sorguyu ve alanları tekrar kontrol edin..
 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Bu şekilde sonuç alamadım. Her lot için aynı sonucu döndürmeye devam ediyor. Kod kısmında geldiğim son durum aşağıdaki gibidir. Girişler toplamından çıkışlar toplamın düşüyor ve miktar olarak sonucu doğru veriyor ama her lot için aynı değeri veriyor.

Bir düzeltme yapmak istiyorum, Hareket Türü yerine Hareket Kodu olarak kullanılıyor. 1 olanlar girişler, -1 olanlar çıkışlar.

SELECT First(SELECT SUM(Miktar) AS [Giris Miktarı]
FROM `D:\Works\Stok_Takip\Stok_Hareket.xlsx`.`Hareketler$`
WHERE (`İsmak Malzeme Kodu`=?) AND `İsmak Lot No` = `İsmak Lot No` AND (`Hareket Kodu` = 1))
-
(SELECT SUM(Miktar) AS [Çıkış Miktarı]
FROM `D:\Works\Stok_Takip\Stok_Hareket.xlsx`.`Hareketler$`
WHERE (`İsmak Malzeme Kodu`=?) AND `İsmak Lot No`= `İsmak Lot No` AND (`Hareket Kodu` = -1)) AS [Fiili Stok],
`İsmak Lot No`, Birim, `Raf Adresi`
FROM `D:\Works\Stok_Takip\Stok_Hareket.xlsx`.`Hareketler$`
WHERE (`İsmak Malzeme Kodu`=?)
GROUP BY `İsmak Lot No`, Birim, `Raf Adresi`
ORDER BY `İsmak Lot No`
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,366
Excel Vers. ve Dili
Office 2013
Ana sorgunuzda aliası yani benim örnekteki "as bb" kısmını göremedim "bb" olmak zorunda değil tabii ama bu isimlendirmeyi iç-alt sorgularınızda kullanmanız gerekiyor. Örneğn "where lotNo=bb.lotNo" gibi... Siz `İsmak Lot No`= `İsmak Lot No` olarak kullanmışsınız.

Ayrıca bunu yaptıktan sonra sorgu sonundaki group ve order a da dikkat etmeniz gerekiyor.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,226
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Ekli dosyada lot numarası alanında tarihe dönen değerler var. Öncelikli olarak bu ve varsa diğer karışıklıklar düzeltilmeli.
 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Evet, dosyadaki verilerin bir kısmı karışmış bunun farkındayım. Biraz da bu nedenle yeni bir dosyalama ve kayıt sistemine geçmek istiyorum çünkü herkes aynı itinayi göstermiyor.

lotno=bb.lotno şeklinde bir sonuç alamamıştım ilk etapta, o yüzden böyle yaptım ama haklısınız, değiştirmek gerek. Deneyip bilgi vereceğim.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,366
Excel Vers. ve Dili
Office 2013
Aklıma geldi de.. Aslında siz 3 sorguyla daha rahat yapabilirsiniz. İlk sorguda girişlerin toplamını alın lota göre, ikincide çıkışa göre ve son sorguda bu iki sorgu arasında lot alanında bire-bir ilişki kurarak sonucu alabilirsiniz. Bu daha basit olabilir sizin için..

Not: Örneğinize bakmadım..
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,332
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Malzeme Adı sanki sorgu için daha uygun gibi görünüyor.

Bu doğrultuda hazırladığım örnek dosyayı inceleyiniz.
 

Ekli dosyalar

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Koray Bey dosyayı indiremiyorum.

beab05 ilginize teşekkür ederim ancak 3. sorgu da işin içine girerse kafamdan dumanlar çıkmaya başlayacak :)
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,271
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
@seismic ;

Resimdeki gibi basit bir "Pivot Table" işinizi görmez mi?

 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Haluk Bey görmüyor ne yazık ki. Bu kısım daha başlangıç, sonrasında sql query'den gelen verileri userform üzerinde gösterip kullanıcıya FIFO'ya göre giriş çıkış yapması için veri sunacağım. Vesaire, vesaire... En kötü ihtimal, çıkış kayıtlarını negatif sayılar ile yaptıracağım. Mesela 100 Kg x lot numaralı bir giriş için 50 Kg çıkış yapılmaya çalışıldığında bunu tabloya -50 olarak kaydedecek.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,271
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
O zaman siz, yukarıda Zeki Beyin bahsettiği gibi Excel dosyasındaki verileri düzeltip, buraya ekleyin .... Bir şekilde çözüm bulunur.

Korhan Bey de dosyasını harici linkten verirse onun alternatifini de görürsünüz, ya da siz "Altın Üye" olup, bizleri harici linklere dosya yükleme zahmetinden kurtarırsınız.

.
 

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Haklısınız, en iyisi dosyadaki verileri düzeltip Altın Üye olmak.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,271
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
@seismic ;

Aşağıdaki resimde belirtilen gibi, ADO ile bir taslak hazırladım. Bu sizin işinizi şimdilik görüyor mu?






.
 
Son düzenleme:

seismic

Altın Üye
Katılım
10 Ekim 2004
Mesajlar
223
Excel Vers. ve Dili
Office 2013 Tr
Koray Bey günaydın, herkese iyi haftalar
Resim çok küçük olduğu için büyütünce seçilmiyor. O yüzden bir şey söylemek zor.
 
Üst