SQL Left Join iki kriter

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,
Ekli dosya Rapor Sayfasında İSİM ve KATEGORİ alanları Data sayfasındakiyle eşleşen YETENEK alanındaki verileri Rapor sayfasına getirmek istiyordum,

özetle 2 kritere göre düşeyara yapmak istemiştim,

yalnız aşağıdaki sorguda bunu yapamadım,

yardımcı olursanız sevinirim.

Kod:
Set RS = CreateObject("ADODB.RecordSet")

    Sql2 = "SELECT T2.[YETENEK] From [Rapor$] AS T1 LEFT JOIN [Data$] AS T2 " & _
    "ON T1.[İSİM]=T2.[İSİM] "
    
    '' AND T1.[KATEGORİ]=T2.[KATEGORİ]
    
RS.Open Sql2, Con, 1, 1
iyi Akşamlar.
 

Ekli dosyalar

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Burda benzer bir sorunuz var.

 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,642
Excel Vers. ve Dili
Pro Plus 2021
Kod:
Sub test()

    Sheets("Rapor").Range("C2:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
    
    With CreateObject("ADODB.CONNECTION")
        .Open "Provider=Microsoft.Ace.Oledb.12.0;Extended Properties='Excel 12.0;HDR=YES;IMEX=0';Data Source=" & _
               ThisWorkbook.FullName
        .Execute " UPDATE [Rapor$A1:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS R INNER JOIN [Data$A1:C" & Sheets("Data").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS D ON (D.İSİM = R.İSİM AND D.KATEGORİ = R.KATEGORİ ) SET R.YETENEK = D.YETENEK"
        .Close
    End With

End Sub
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Kod:
Sub test()

    Sheets("Rapor").Range("C2:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
  
    With CreateObject("ADODB.CONNECTION")
        .Open "Provider=Microsoft.Ace.Oledb.12.0;Extended Properties='Excel 12.0;HDR=YES;IMEX=0';Data Source=" & _
               ThisWorkbook.FullName
        .Execute " UPDATE [Rapor$A1:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS R INNER JOIN [Data$A1:C" & Sheets("Data").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS D ON (D.İSİM = R.İSİM AND D.KATEGORİ = R.KATEGORİ ) SET R.YETENEK = D.YETENEK"
        .Close
    End With

End Sub
Çok teşekkür ederim Veysel Hocam
Bunun SELECT yöntemiyle çözümü yok sanırım
 
Son düzenleme:

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Kod:
Sub test()

    Sheets("Rapor").Range("C2:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
   
    With CreateObject("ADODB.CONNECTION")
        .Open "Provider=Microsoft.Ace.Oledb.12.0;Extended Properties='Excel 12.0;HDR=YES;IMEX=0';Data Source=" & _
               ThisWorkbook.FullName
        .Execute " UPDATE [Rapor$A1:C" & Sheets("Rapor").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS R INNER JOIN [Data$A1:C" & Sheets("Data").Cells(Rows.Count, 1).End(xlUp).Row & _
                 "] AS D ON (D.İSİM = R.İSİM AND D.KATEGORİ = R.KATEGORİ ) SET R.YETENEK = D.YETENEK"
        .Close
    End With

End Sub
Veysel Hocam bir konu farkettim
"YETENEK" alanı nümerik değer olmadığı zaman boş getiriyor,
bunun bir çözümü olabilir mi?
teşekkürler,
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,359
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhaba,

Deneyip sonucu söyler misiniz?

Kod:
Sql2 = "SELECT A.[YETENEK] FROM [Data$] A, [Rapor$] B " & _
       "WHERE A.[İSİM] & A.[KATEGORİ] = B.[İSİM]&B.[KATEGORİ] "
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,

Deneyip sonucu söyler misiniz?

Kod:
Sql2 = "SELECT A.[YETENEK] FROM [Data$] A, [Rapor$] B " & _
       "WHERE A.[İSİM] & A.[KATEGORİ] = B.[İSİM]&B.[KATEGORİ] "
Necdet Hocam teşekkürler,
Rapor sayfasında 30 kayıt var; sonuç olarak 34 kayıt getiriyor, bazı kayıtlarda ise hatalı sonuç getirdi.
iyi Akşamlar.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Veysel Hocam bir konu farkettim
"YETENEK" alanı nümerik değer olmadığı zaman boş getiriyor,
bunun bir çözümü olabilir mi?
teşekkürler,

"Data" sayfasındaki "YETENEK" sütununu "Metin" olarak biçimlendirin...... Veysel Beyin kodunu daha sonra çalıştırın.

.
 
Katılım
6 Kasım 2004
Mesajlar
225
Excel Vers. ve Dili
Excel 2016
Türkçe 64 BIT
Altın Üyelik Bitiş Tarihi
25-07-2023

A3

C

A4

D

A5

E

A6

A

A7

B

A8

C

A9

D



Hocam üstteki kayıtların ikişer tane yeteneği var, onlardan hangileri gelmeli?
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,359
Excel Vers. ve Dili
Ofis 365 Türkçe
Necdet Hocam teşekkürler,
Rapor sayfasında 30 kayıt var; sonuç olarak 34 kayıt getiriyor, bazı kayıtlarda ise hatalı sonuç getirdi.
iyi Akşamlar.
Merhaba,
Sonradan aklıma geldi, kodu değiştirdim.
Sizin gördüğünüz hatayı bende göndüm. Aşağıdaki kodu C2 hücresine değil, örneğin F2 hücresine yazdırın.
Bir de böyle deneyin, bana doğru gibi geldi.

Kod:
Sql2 = "SELECT A.[İSİM], A.[KATEGORİ], A.[YETENEK] FROM [Data$] A, [Rapor$] B " & _
       "WHERE A.[İSİM] & A.[KATEGORİ] = B.[İSİM]&B.[KATEGORİ] "
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Alternatif;

C++:
Sql2 = "SELECT T2.YETENEK From [Rapor$] AS T1 LEFT JOIN " & _
       "(Select [İSİM],[KATEGORİ],First([YETENEK]) As YETENEK From [Data$] Group By [İSİM],[KATEGORİ]) AS T2 " & _
       "ON T1.[İSİM]=T2.[İSİM] And T1.[KATEGORİ]=T2.[KATEGORİ]"
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,
Sonradan aklıma geldi, kodu değiştirdim.
Sizin gördüğünüz hatayı bende göndüm. Aşağıdaki kodu C2 hücresine değil, örneğin F2 hücresine yazdırın.
Bir de böyle deneyin, bana doğru gibi geldi.

Kod:
Sql2 = "SELECT A.[İSİM], A.[KATEGORİ], A.[YETENEK] FROM [Data$] A, [Rapor$] B " & _
       "WHERE A.[İSİM] & A.[KATEGORİ] = B.[İSİM]&B.[KATEGORİ] "
Necdet Hocam bu şekilde tüm verileri getiriyor, Rapor sayfası, Data sayfasına göre daha kısa;

Aşağıdaki gibi de denedim, burada da yine tüm listeyi getiriyor.

Kod:
Sql2 = "SELECT  B.[YETENEK] FROM [Rapor$] A LEFT JOIN [Data2$] B " & _
     "ON A.[İSİM]&A.[KATEGORİ] = B.[İSİM]&B.[KATEGORİ] "
teşekkürler,
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,359
Excel Vers. ve Dili
Ofis 365 Türkçe
hmm öğrenmiş oldum, bu yöntem demekki yeterli değil.

Peki örnek dosyayı inceler misiniz? Bu şekilde veri olduğunda çalışma mantığı yanlış mı oluyor?
 

Ekli dosyalar

Son düzenleme:

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Alternatif olarak #11 nolu mesajımda paylaştığım sorguyu deneyebilirsiniz.
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Alternatif;

C++:
Sql2 = "SELECT T2.YETENEK From [Rapor$] AS T1 LEFT JOIN " & _
       "(Select [İSİM],[KATEGORİ],First([YETENEK]) As YETENEK From [Data$] Group By [İSİM],[KATEGORİ]) AS T2 " & _
       "ON T1.[İSİM]=T2.[İSİM] And T1.[KATEGORİ]=T2.[KATEGORİ]"
Olay Budur Korhan Hocam,
Sağ olun, var olun!
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Alternatif;

C++:
Sql2 = "SELECT T2.YETENEK From [Rapor$] AS T1 LEFT JOIN " & _
       "(Select [İSİM],[KATEGORİ],First([YETENEK]) As YETENEK From [Data$] Group By [İSİM],[KATEGORİ]) AS T2 " & _
       "ON T1.[İSİM]=T2.[İSİM] And T1.[KATEGORİ]=T2.[KATEGORİ]"
Korhan Hocam öğrenmek amacıyla bir şey soracağım;
Kod:
Group By [İSİM],[KATEGORİ]
önemli bir işlev üstleniyor sanırım, burada iki kriter olduğu için bunu kullanmak zorundayız anladığım kadarıyla,
tek kriterli LEFT JOIN operatöründe buna gerek duyulmuyordu
her şey için teşekkürler,
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Oradaki gruplandırma sizin DATA sayfanızda ki verilerin tekrar etmesinden dolayıdır.

Bildiğiniz gibi DÜŞEYARA ilk bulduğu datayı getiriyor. Sizinde istediğiniz sonuç bu olduğu için tek başına LEFT JOIN sorgusu yeterli olmuyor. Bu sebeple alt sorgu ile işi çözüyoruz.

Zaten bu durumun benzerini #2 nolu mesajımda paylaştığım ve size ait başka bir başlıkta yine sormuştunuz.
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,043
Excel Vers. ve Dili
Office 2013 İngilizce
Oradaki gruplandırma sizin DATA sayfanızda ki verilerin tekrar etmesinden dolayıdır.

Bildiğiniz gibi DÜŞEYARA ilk bulduğu datayı getiriyor. Sizinde istediğiniz sonuç bu olduğu için tek başına LEFT JOIN sorgusu yeterli olmuyor. Bu sebeple alt sorgu ile işi çözüyoruz.

Zaten bu durumun benzerini #2 nolu mesajımda paylaştığım ve size ait başka bir başlıkta yine sormuştunuz.
Teşekkür ederim Korhan Hocam
 
Katılım
6 Kasım 2004
Mesajlar
225
Excel Vers. ve Dili
Excel 2016
Türkçe 64 BIT
Altın Üyelik Bitiş Tarihi
25-07-2023
Alternatif;

C++:
Sql2 = "SELECT T2.YETENEK From [Rapor$] AS T1 LEFT JOIN " & _
       "(Select [İSİM],[KATEGORİ],First([YETENEK]) As YETENEK From [Data$] Group By [İSİM],[KATEGORİ]) AS T2 " & _
       "ON T1.[İSİM]=T2.[İSİM] And T1.[KATEGORİ]=T2.[KATEGORİ]"
Hocam, hemen yan sütuna, ikincileri almak için ne yapmak lazım?
 
Üst