• DİKKAT

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

SQL Left Join iki kriter

  • Konbuyu başlatan Konbuyu başlatan tamer42
  • Başlangıç tarihi Başlangıç tarihi

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,201
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

Merhaba,

Burda benzer bir sorunuz var.

 
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
 
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:
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,
 
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İ] "
 
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.
 
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.

.
 

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 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İ] "
 
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İ]"
 
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,
 
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:
Alternatif olarak #11 nolu mesajımda paylaştığım sorguyu deneyebilirsiniz.
 
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!
 
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,
 
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.
 
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
 
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?
 
Geri
Üst