SQL - Pivot

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Merhaba;

Ekli dosyadaki örnek tablodaki verilerle elde edilen Pivot tablonun benzerini, dosyanın 2. sayfasında VBA kodlarıyla "SQL-Pivot" komutunu kullanarak elde etmeye çalıştım ama sorguda hata mesajı aldım.

Dosyadaki SQL sorgusunda düzeltme önerisi olan arkadaşlar, iletirse şimdiden teşekkürlerimi sunarım. Burada amaç; VBA kodlarıyla "Pivot Tablo" oluşturmak değil, SQL sorgusunda PIVOT komutunu kullanarak benzer bir tablo elde etmek.

Selamlar,
 

Ekli dosyalar

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Bilgi:

SQL sorgusunda TRANSFORM ile tüm markaların satış bedelleri aşağıdaki şekliyle alınabiliyor;


Kod:
    strSQL = "Transform Sum([Satis_Bedeli]) as mySum Select Marka, Arac, Sum(Satis_Bedeli) " & _
             "from [Sheet1$] " & _
             "Group by [Marka] Pivot [Arac]"

ancak, sorguda aşağıdaki gibi kriter koymaya çalışınca hata veriyor....


Kod:
    strSQL = "Transform Sum([Satis_Bedeli]) For [Marka] In ('BMC', 'Honda') " & _
             "Select Marka, Sum(Satis_Bedeli) from [Sheet1$] " & _
             "Group by [Marka] Pivot [Arac]"
.
 

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,428
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Kod:
    strSQL = "Transform Sum([Satis_Bedeli]) Select Marka, Sum(Satis_Bedeli) from [Sheet1$] " & _
             "where marka in ('BMC', 'Honda') Group by [Marka] Pivot [Arac]"
Haluk bey selamlar,

Aşağıdaki sorgu işinizi görür mü?
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Merhaba Erdem Bey;

Bilgisayarın başına ancak şimdi geçebildim.... önerinizi denedim ve sonuç olumlu, teşekkür ederim.

Demek FOR .... IN gibi bir yapı burada çalışmıyor ki, siz onu WHERE ... IN olarak simule etmişiniz.

Bu arada; aynı sorgu içinde Grand Total'ı da alabilir miyiz acaba?

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Anladım Erdem Bey ....... Access kullanma imkanı olmayınca o zaman raw table şeklinde ancak bu kadarını alabiliyoruz demek.

Doğrusu hayal kırıklığı oldu ..... :(

Tekrar teşekkürler,

.
 

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,428
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Anladım Erdem Bey ....... Access kullanma imkanı olmayınca o zaman raw table şeklinde ancak bu kadarını alabiliyoruz demek.

Doğrusu hayal kırıklığı oldu ..... :(

Tekrar teşekkürler,

.
Aynı hayal kırıklığını kısa süre önce bende yaşamıştım. :)
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Merhaba Erdem Bey;

Ben ekli dosyadaki gibi bir alternatif ürettim, işimi görüyor......

Bu alternatifte özetle; ADO'nun veri tabanına bağlanması zaten vakit aldığı için, ikinci bir sorguyla veri tabanına tekrar bağlanıp başka bir PIVOT ile toplamları almak yerine, ilk sorgudan geri dönen sonuç setini CopyFromRecordset metodu yerine ufak bir For-Next döngüsü ile alıp, burada "Toplam" değerini de hesaplatarak bana lazım olan sütunları yazdırdım.

Bunun gibi başka bir sürü yol bulunur tabii ama, bu yöntem gerçek veri tabanımda sorunu çözmeye yetiyor.

Selamlar,

.
 

Ekli dosyalar

Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,079
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Merhaba Haluk Bey.
Dosyanın kendi kendisine bağlantı açan hem Connection, hem de recordset biraz yavaş olabiliyor. İkinci sql sorgusu için hazırda olan açık bağlantıyı tekrar kullanabiliyoruz.

Not: Transform deyimi biraz gereksiz gibi geldi.
 
Son düzenleme:

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Merhaba Haluk Bey.
İkinci sql sorgusu için hazırda olan açık bağlantıyı tekrar kullanabiliyoruz.

Not: Transform deyimi biraz gereksiz gibi geldi.
Evet Zeki Bey, haklısınız aslında....... açık bağlantıyı kapatmadan tekrar kullanabiliriz.

"Transform" konusunda ben de emin değilim açıkçası ..... internetten araştırdığım örneklerde rastladığım bir yapıyı modifiye etmiştim. Kod çalışınca da, üzerine fazla düşmedim.

"Transform" kullanmadan SQL komutunu ne şekilde yazabiliriz acaba?

.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,079
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Transform, satır değerlerini sütun olarak göstermede kullanılıyor. Yani aşağıdaki gibi bir sonuç bekliyorsanız Transform deyimi kullanın. Siz zaten marka bazında toplam aldığınız için (örnekte Honda motor ve otomobil birlikte toplam alınmış) Transform gereksiz olmuş.

Transform ile elde edilebilecek rapor...

1544032566853.png

Eğer, Honda için motorsiklet ve otomobil tipi farketmiyorsa toplamı standart şekilde (Transform dan daha hızlı olmasını bekliyorum) aşağıdaki gibi alabiliriz:

SQL:
select marka , sum(satis_bedeli) as toplam from [sayfa1$] where marka in ('Honda', 'BMC') group by marka
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Zeki Bey, elde etmek istediğim tabloyu 8. mesajda az önce revize ettiğim tabloda belirttim.

Sanırım, "Transform" benim aradığım metodmuş.

Teşekkürler,

.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,079
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Revize dosyada da Transform gerekli değil üstad. :)
Group By sözcüğü gruplayarak toplam almakta. Zaten amacı budur.
Sadece, araç tipini sütunlara dağıtmak istediğinizde Transform' ihtiyacınız olacak.

Bu da Pivot Table versiyonu:
1544033985964.png
 

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,428
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Haluk bey merhaba,

8. mesajı inceleyince @ZEKİ bey'in de dediği gibi transform gerekmediğini gördüm.
Aşağıdaki sorgu ile grandtotal alınmış olarak tek sorgu'da işlem yapılabilir.

Kod:
sorgu = "select marka ,arac, sum(satis_bedeli) as toplam from [Sheet1$] where marka in ('Honda', 'BMC') group by marka,arac " & _
        "union all " & _
        "select '','Toplam',sum(satis_bedeli)as bedel from [Sheet1$] where marka in ('Honda', 'BMC') "
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Merhaba Erdem Bey;

Bu alternatif güzel olmuş doğrusu..... PIVOT kullanmadan, hem de For-Next yerine CopyFromRecordset metodunu kullanabilmeye olanak sağlıyor.

PIVOT kullanmaya odaklanınca, kafayı çalıştırmayı unutmuşum ... :mad:

Teşekkürler,

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Revize dosyada da Transform gerekli değil üstad. :)
Group By sözcüğü gruplayarak toplam almakta. Zaten amacı budur.
Sadece, araç tipini sütunlara dağıtmak istediğinizde Transform' ihtiyacınız olacak.

Hmmm..... "Transform" olayının inceliğini şimdi anladım sanırım...... ;)

Teşekkürler üstadım, benim açımdan faydalı bir konu oldu bu başlık.

.
 

Korhan Ayhan

Moderatör
Yönetici
Katılım
15 Mart 2005
Mesajlar
33,280
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Ofis 2016 Tr-En 32 Bit
Merhaba @Zeki Gürsoy Bey,

#11 nolu mesajda bahsettiğiniz Transform için örnek kodlamayı paylaşabilir misiniz?
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Korhan Bey, istediğiniz ekli dosyadaki gibi mi acaba ?

Eğer değilse, Zeki Bey cevap yazar herhalde...

.
 

Ekli dosyalar

Korhan Ayhan

Moderatör
Yönetici
Katılım
15 Mart 2005
Mesajlar
33,280
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Ofis 2016 Tr-En 32 Bit
Haluk Bey,

Paylaşım için teşekkürler.

Ben şu şekilde bir kurgu düşünmüştüm.

Araç Çeşitleri sizin elle yazdığınız gibi (L9:N9) değilde bu bölüm çeşide göre otomatik oluşsun.
J10:J11 hücrelerinde yazan Marka bilgileri yerine de C1 ve D1 hücre bilgileri gelsin.

217147
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
10,203
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
Anlıyorum.... siz işi biraz daha derinleştirelim diyorsunuz.


O zaman Zeki Beyi bekleyelim bakalım ....

.
 
Üst