SQL sorgusunda kodu kısaltma

Katılım
29 Ocak 2024
Mesajlar
141
Excel Vers. ve Dili
Office 2016
Kıymetli Hocalarım selamlar saygılar


Aşaşıdaki SQL sorgusunda
[DURUM] alanı 'A' , 'B' ve 'C' olanları [BRANS] Branşlara göre ayrı-ayrı çekiyordum,

burada 3 ayrı sorgu oluşturup, 3 defa kayıt kümsei oluşturmak yerine tek bir seferde yapılabilir mi?

böyle bir şey mümkün olur mu?

Yardımlarınız için şimdiden teşekkür ederim.


Kod:
Set SH = Sayfa5

SH.Range("A1:N10000").ClearContents

Set RS = VBA.CreateObject("adodb.RecordSet")

' ' A  /  /  /  /  /  /  /  /  /  /  /  /
Sorgu = "Select [BRANS], COUNT([ID_NO]) From [Data$] Where [DURUM]= 'A'"
Sorgu = Sorgu & " Group BY [BRANS]"

RS.Open Sorgu, Con

SH.Range("E2").CopyFromRecordset RS
RS.Close

' ' B /  /  /  /  /  /  /  /  /  /  /  /
Sorgu = "Select [BRANS], COUNT([ID_NO]) From [Data$] Where [DURUM]= 'B'"
Sorgu = Sorgu & " Group BY [BRANS]"

RS.Open Sorgu, Con

SH.Range("H2").CopyFromRecordset RS

RS.Close

' ' C /  /  /  /  /  /  /  /  /  /  /  /
Sorgu = "Select [BRANS], COUNT([ID_NO]) From [Data$] Where [DURUM]= 'C'"
Sorgu = Sorgu & " Group BY [BRANS]"

RS.Open Sorgu, Con

SH.Range("K2").CopyFromRecordset RS

RS.Close
iyi Akşamlar.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,374
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
SQL:
Select [BRANS], [DURUM], COUNT([ID_NO])
From [Data$]
Where [DURUM] in('A', 'B', 'C')
Group BY [BRANS], [DURUM]
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,109
Excel Vers. ve Dili
Office 2013 İngilizce
SQL:
Select [BRANS], [DURUM], COUNT([ID_NO])
From [Data$]
Where [DURUM] in('A', 'B', 'C')
Group BY [BRANS], [DURUM]
Zeki Hocam ilginiz için teşekkürler,
Yalnız ben buradaki ('A', 'B', 'C') kategorilerini ayrı ayrı gelmesini istiyordum, sizin verdiğin kodlarda hepsi birleşik geliyor
çünkü hepsinde aynı branşlar olmayabiliyor.

Talebimi Ekli linkteki ekran görüntüsünde anlatmaya çalıştım.

https://dosya.co/7wr8ium0htpl/141158.jpg.html

tekrar teşekkürler, iyi akşamlar.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,374
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
İki hesap kullanıyorsunuz galiba... ?

Ayrıca resimleri foruma yükleyin; öteye beriye yönlendirilmekten bıktım...

.
 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
@Zeki Gürsoy hocamın kodu kullanarak oluşturduğunuz recordseti filtreleyerek kullanabilirsiniz. Ama bu durumda da durum verisini de almanız gerekir. Durum verisinin sütunlarda yer almaması için ayrı işlem yapılması gerekir bu daha da uzun bir kod demektir.

Yada birleşik sorgu kullanıp tek sorguyla halledilebilir ama biraz karmaşık bir sorgu olabilir.
Not: hiç birini denemedim sadece aklıma gelen olasılıkları söyledim.
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,109
Excel Vers. ve Dili
Office 2013 İngilizce
@Zeki Gürsoy hocamın kodu kullanarak oluşturduğunuz recordseti filtreleyerek kullanabilirsiniz. Ama bu durumda da durum verisini de almanız gerekir. Durum verisinin sütunlarda yer almaması için ayrı işlem yapılması gerekir bu daha da uzun bir kod demektir.

Yada birleşik sorgu kullanıp tek sorguyla halledilebilir ama biraz karmaşık bir sorgu olabilir.
Not: hiç birini denemedim sadece aklıma gelen olasılıkları söyledim.
önerileriniz için Teşekkür ederim Halil Hocam
 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
@Zeki Gürsoy hocamın kodunun düzenlenmiş hali
Kod:
Sub Asil_Zeki()
t1 = Timer
Set SH = Sayfa5

SH.Range("A1:N10000").ClearContents

Set RS = VBA.CreateObject("adodb.RecordSet")
yol = ThisWorkbook.FullName
 Set Con = CreateObject("adodb.connection")
With Con
    .provider = "Microsoft.ACE.OLEDB.12.0"
    .connectionstring = "Data Source=" & yol & ";Extended Properties=""Excel 12.0;"""
    .Open
End With

Sorgu = "Select [BRANS], COUNT([ID_NO]) as Say,[DURUM] From [Data$]"
Sorgu = Sorgu & " Group BY [BRANS],[DURUM]"

RS.Open Sorgu, Con, 3, 1

RS.Filter = "DURUM='A'": SH.Range("E2").CopyFromRecordset RS: SH.Range("G1:G10000").ClearContents
RS.Filter = "DURUM='B'": SH.Range("H2").CopyFromRecordset RS: SH.Range("J1:J10000").ClearContents
RS.Filter = "DURUM='C'": SH.Range("K2").CopyFromRecordset RS: SH.Range("M1:M10000").ClearContents

t2 = Timer
Debug.Print "Asil_zeki", t2 - t1
End Sub
 
Üst