• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Sorgu ile iki tablodan son tarihi ve bu tarihe ait tutarı alarak tek tablo nasıl yapılır.

  • Konbuyu başlatan Konbuyu başlatan emsey
  • Başlangıç tarihi Başlangıç tarihi
Katılım
18 Mart 2007
Mesajlar
171
Excel Vers. ve Dili
OFFICE 2016
Saygıdeğer üstadlar aşağıdaki kod ile satış tarihine eşit ve küçük son alış tarihini ve bu tarihteki alış fiyatını tek sorgu ile birlikte almak istiyorum ama aşağıdaki yaptığım kodda tüm satışları çekiyorum, yanına son alım tarihini getiriyorum fakat son alış tarihindeki fiyat gelmiyor, alımlar içindeki en yüksek fiyat geliyor. Bana bu konuda yardımcı olursanız çok mutlu olurum. Şimdiden ilgi ve anlayışınız için sonsuz teşekkür ediyorum.

Örneğin: 15.03.2023 tarihli satış var, alımları 11.03.2013 tarihinde 40 TL, 12.03.2023 tarihinde 50 TL, 13.03.2023 tarihinde 45 TL ise, bana 15.03.2023 tarihli satış karşısında son alım 13.03.2023 tarihi ve 45 TL getirmesi gerekirken, 13.03.2023 getirebiliyorum ancak fiyatı 50 TL geliyor. Yani en yüksek fiyat geliyor.

sorgu = "Select [satis$].[TARİH],[satis$].[STOK KODU],[satis$].[STOK AÇIKLAMA],MAX([fiyat$].[TARİH]), MAX([fiyat$].[ALIŞ FİYATI]) FROM [satis$],[fiyat$] " & _
" where [fiyat$].[TARİH] <= [satis$].[TARİH] AND [satis$].[STOK KODU] = [fiyat$].[STOK KODU] " & _
"group by [satis$].[TARİH],[satis$].[STOK KODU],[satis$].[STOK AÇIKLAMA]" & _
"ORDER BY [satis$].[STOK KODU]"
 

Ekli dosyalar

İstediğiniz bu mu, bilemedim .... Siz bir ara denersiniz.

C#:
sorgu = " Select T1.[STOK KODU], T1.[STOK AÇIKLAMA], T2.MaxDate, T2.[ALIŞ FİYATI] " & _
        " From [satis$] As T1 " & _
        " Inner Join " & _
        " (Select [STOK KODU], [ALIŞ FİYATI], Max(TARİH) As MaxDate From [fiyat$] " & _
        " Group By [STOK KODU], [ALIŞ FİYATI]) As T2 " & _
        " On T1.[STOK KODU] = T2.[STOK KODU] And T1.[TARİH] = T2.MaxDate " & _
        " Order By T1.[TARİH] "

.
 
İstediğiniz bu mu, bilemedim .... Siz bir ara denersiniz.

C#:
sorgu = " Select T1.[STOK KODU], T1.[STOK AÇIKLAMA], T2.MaxDate, T2.[ALIŞ FİYATI] " & _
        " From [satis$] As T1 " & _
        " Inner Join " & _
        " (Select [STOK KODU], [ALIŞ FİYATI], Max(TARİH) As MaxDate From [fiyat$] " & _
        " Group By [STOK KODU], [ALIŞ FİYATI]) As T2 " & _
        " On T1.[STOK KODU] = T2.[STOK KODU] And T1.[TARİH] = T2.MaxDate " & _
        " Order By T1.[TARİH] "

.
Üstad emeğine sağlık. Kodları denedim fakat Group by ile ilgili bir sıkıntı var. Editlemeye çalıştım ama çözemedim. Genel olarak Satışta ay boyunca her gün satılan buna nazaran alış tablosunda ay içinde bir kaç kere alınmış ürünler oluyor. Sorguda tüm satışlar içinden Satış Tarihi ve Stok Koduna göre group by olup tüm ürünler Stok Kodu ile ve satış tarihiyle group by olup satışlar gelecek, yanına alıştaki son alınan tarih ve son alınan tarihteki alış fiyatı gelecek. Bu sorguda, Satış içinde neredeyse her gün olan alışta ayda 3 kere alınmış olan ürünlerden bazıları bir defa bazıları birden fazla 2 veya 3 farklı satırda geliyor. Gelenlerin tarihini anlam yükleyemedim. Hangi koşula göre getirdiğini çözemedim. Alıştaki son tarih değil, satıştaki tarihlerdense bazılarına uyuyor. Tarihi neye göre seçip aldığını çözemedim. Satışlar içindeki herhangi bir tarihe denk geliyor.
 
Yine de tam anlamamış olabilirim, ama bir deneyin...

C#:
sorgu = " Select Distinct T1.[STOK KODU], T1.[STOK AÇIKLAMA], T2.MaxDate, T2.[ALIŞ FİYATI] " & _
        " From [satis$] As T1 " & _
        " Inner Join " & _
        " (Select [STOK KODU], [ALIŞ FİYATI], Max(TARİH) As MaxDate From [fiyat$] " & _
        " Group By [STOK KODU], [ALIŞ FİYATI]) As T2 " & _
        " On T1.[STOK KODU] = T2.[STOK KODU] And T1.[TARİH] <= T2.MaxDate " & _
        " Order By T1.[STOK AÇIKLAMA] "

.
 
@Haluk üstad bir veya birden fazla değer bulunamadı diyor. Tek tek baktım hata nerede bulamadım bu sebeple deneyemiyorum. Sorguda bir yerde hata var ama nerede hata olabilir gözümden kaçan bir şey mi var acaba

Edit: bende hata varmış kod çalıştı ama ben anlatamamış olabilirim.
Şuanda kodu çalıştırdım ama Satışların tümü gelmiyor üstad. [satis] sayfasındaki tüm satışlar smm sayfasına gelmesine ihtiyacım var satış tarihine eşit veya küçük olarak [fiyat] sayfasındaki son Tarih ve son tarihteki alış fiyat gelecek. Yani tablo şu şekilde SATIŞ TARİH, STOK KODU, SON ALIM TARİHİ, SON ALIŞ FİYATI şeklinde
 

Ekli dosyalar

Son düzenleme:
Bende çalışan dosya ektedir...

.
 

Ekli dosyalar

Bende çalışan dosya ektedir...

.
Üstad indirdim baktım dosyaya kod çalışıyor bende de sonradan çalıştı düzenle diyerek mesajımı yenilemiştim. Kod çalıştı ancak senin eklediğin excel üzerinden söylersem daha net olacak diye düşünüyorum. Sheet1 sayfasında A Sütunundan 153.001.002 kodlu ürünü filtre ettiğimizde sadece 2 adet geliyor oysaki satis sayfasında 153.001.002 kodlu ürünü filtre ettiğimizde 36 adet var. Sheet1 sayfasında tüm satışların hepsi 36 tane (kaç tane varsa) gelmeli sorgu neden sadece 2 adetini çektiğini anlamadım. Özetle satis sayfasındaki tüm satışları getirmeli A sütunu Tarih, B Sütünu Stok Kodu, C Sütunu Stok açıklama şeklinde tamamını getirmeli sadece D Sütununa son alış tarihini (fiyat sayfasından A sütun), ve E sütununa son alış tarihindeki alış fiyatını (fiyat sayfasından C sütünu) getirmeli. Ben bunu şu aşağıdaki kod ile doğruya yakın yapabiliyorum sadece son alış tarihinin karşısındaki fiyatı değilde maksimum fiyat geliyor sadece bu kısmını beceremedim.

benim kodu veriyorum
Kod:
sorgu = "Select [satis$].[TARİH],[satis$].[STOK KODU],[satis$].[STOK AÇIKLAMA],MAX([fiyat$].[TARİH]), MAX([fiyat$].[ALIŞ FİYATI]) " & _
        " FROM [satis$],[fiyat$] " & _
        " where [fiyat$].[TARİH] <= [satis$].[TARİH]and[satis$].[STOK KODU] = [fiyat$].[STOK KODU] " & _
        " group by [satis$].[TARİH],[satis$].[STOK KODU],[satis$].[STOK AÇIKLAMA]" & _
        " ORDER BY [satis$].[STOK KODU]"
 
Tabiki tüm işlemleri sorgu ile halletmek daha iyi pratik olur.
Ama alternatif olarak ;
Verilerin yoğunluğu fazla değilse;
Tümünü çekip. Özet tablo yada farklı bir yöntem ile, istediğiniz gibi tablo oluşturma imkanınız olabilir mi ?
 
Tabiki tüm işlemleri sorgu ile halletmek daha iyi pratik olur.
Ama alternatif olarak ;
Verilerin yoğunluğu fazla değilse;
Tümünü çekip. Özet tablo yada farklı bir yöntem ile, istediğiniz gibi tablo oluşturma imkanınız olabilir mi ?
Veri çok fazla olduğu için, MAK kodu, dizi kodları ile çok ağır oluyor ve çok ciddi kasma yapıyor bu sebeple ADO ile çok hızlı anlık geldiği için ADO ile yapmak istiyoruz. Diğer yollar ciddi sıkıntı oluyor. İlginiz için çok teşekkür ediyorum
 
Sizin istediğiniz ekli örnek dosyadaki gibi sanırım.....

Ama, ekli örnek dosyadaki veriler sizin verilere göre çok küçük olduğu rahat çalışıyor. Sizin orjinal dosya üzerinde denediğimde, benim 12 yıllık bilgisayarımda 2-3dakika geçince ben dosyayı kapatıyorum, çalışması belki 1 hafta sürer....

.
 

Ekli dosyalar

Son düzenleme:
Sizin istediğiniz ekli örnek dosyadaki gibi sanırım.....

Ama, ekli örnek dosyadaki veriler sizin verilere göre çok küçük olduğu rahat çalışıyor. Sizin orjinal dosya üzerinde denediğimde, benim 12 yıllık bilgisayarımda 2-3dakika geçince ben dosyayı kapatıyorum, çalışması belki 1 hafta sürer....

.
Emeğine sağlık üstad tam istediğim gibi olmuş tam da istediğim buydu test dosyasında görünce çok sevinmiştim heyecanla orjinal dosyada denedim ama bende de orjinal dosya üzerinde yanıt vermedi işlemi gerçekleştiremedi çok ciddi kastı bende kapatmaya zorladım. sorgu ile yapmak istememdeki amaç vba kodları ile veya klasik excel max(eğer) iç içe kodlarla çok kasmasıydı. Ama senin kodlar harika olmuş 2 haftadır denediğim yapamadığım şey buydu. Şimdi artık nasıl yapacağım bilmiyorum. Sorgu yöntemiyle de olmuyor demek ki? Power Query içinde iki tablodan bu sonucu alabilir miyiz acaba diye sesli düşünüyorum. Bizim bilgi işlemci sql ileri derece bilmediği için direk view dosyası veriyor bende onlara bağlanıyorum işimi kendim çözmeye çalışıyorum sql üzerinden yapıp sorguyu view ile excele direk çekebilseydim aslında en müthişi olacaktı. :( öylece kalakaldım
 
ADO ile SQL kasiyorsa, PQ ile de aynisi olur...

.
 
Son düzenleme:
Merhaba,

Bu linkte önerdiğim çözüm asıl dosyanızda nasıl performans verdi.

 
Merhaba,

Bu linkte önerdiğim çözüm asıl dosyanızda nasıl performans verdi.

Oradaki sorguyu excele uyarlayamadım ama @Haluk üstad o kodlara bakıp uyarlayabilirse belki daha verimli bir sonuç olur. Aynı şeyi bazı farklarla anlatmış ancak daha verimli olabilir. Ben excele uyarlayamadım. Bizim bilgi işlemdeki arkadaşlara senin önerdiğin sql kodlarını verdim oda denedi sql'e uyarlayamadı ama çalışıyor.
 
Benim bahsettiğim o linkteki #31 nolu mesajdaki önerdiğim çözümdür. Onu asıl dosyanızda denediniz mi?
 
Merhaba,

Aşağıdaki kodu denersiniz.

C++:
Sub GetPriceFromMaxDate()
    Dim cn As Object
    Dim rs As Object
    Dim strSQL As String
    Dim sh1 As Worksheet
    Dim Process_Time As Double
      
    Application.ScreenUpdating = False
    
    Process_Time = Timer
    
    Set cn = CreateObject("ADODB.Connection")
    cn.ConnectionString = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
    cn.Open
    
    strSQL = "SELECT s.[TARİH], s.[STOK KODU], s.[STOK AÇIKLAMA], i.[TARİH], i.[ALIŞ FİYATI] " & _
            "FROM [Satış$] s " & _
            "INNER JOIN [fiyat$] i ON s.[STOK KODU] = i.[STOK KODU] WHERE i.[TARİH] = " & _
                "(SELECT MAX([TARİH]) As MaxDate " & _
                "FROM [fiyat$] i2 " & _
                "WHERE i2.[STOK KODU] = s.[STOK KODU] And i2.[TARİH] <= s.[TARİH] ) " & _
             "ORDER BY s.[STOK KODU], s.[TARİH]"
      
    Set sh1 = Sheets("Sonuç")
    
    Set rs = cn.Execute(strSQL)
    
    sh1.Range("A2:E" & sh1.Rows.Count).ClearContents
    sh1.Range("A1:E1").Value = Array("Satış Tarihi", "Stok Kodu", "Stok Açıklama", "Alış Tarihi", "Satış Fiyatı")
    sh1.Range("A2").CopyFromRecordset rs

    rs.Close
    cn.Close
    
    Set rs = Nothing:   Set cn = Nothing:   Set sh1 = Nothing
    
    Application.ScreenUpdating = True
  
    MsgBox "İşleminiz tamamlanmıştır." & vbCrLf & _
           "İşlem süresi ; " & Format(Timer - Process_Time, "0.00") & " Saniye", vbInformation
    
End Sub
 
Benim bahsettiğim o linkteki #31 nolu mesajdaki önerdiğim çözümdür. Onu asıl dosyanızda denediniz mi?
Denedim üstad senin ado ve dizi birlikte yazdığın kod ilk 3 aylık veri dosyalarında kabul edilebilir bir hızda oldu, bu kodları kendi projeme uyarlayacağım. 3 ay sonra veriler çoğaldıkça tekrar değerlendiririz. sadece ADO sorgu ile excel patlıyor yanıt vermiyor. Senin ADO ve Dizi ile yazdığın kod iyi oldu eline emeğine sağlık.

@dost üstad sorgu ile yanıt vermedi excel kastı sorgu ile çok çok daha hızlı ve stabil olacağını düşünüyorduk ama olmadı veya sorgu ile daha hızlı bir yolu varsa bulamadık.
 
Geri
Üst