“Power Query: birleştirme, ekleme, özetten çıkarma” dersinde iki sorguyu bir anahtarla birleştirmeyi gördük. Orada hep varsayılan türü, sol dış birleştirmeyi kullandık. Oysa Birleştir (Merge) penceresindeki Birleştirme türü (Join kind) listesinde altı seçenek var ve her biri farklı bir soruya cevap verir.
Altı birleştirme türü
Örnekte sol tablo bir satış dökümü, sağ tablo ürün listesi; anahtar UrunNo.
| Tür | Hangi satırlar kalır? | Cevapladığı soru | M |
|---|---|---|---|
| Sol dış (Left outer) | Soldaki tüm satırlar + sağdan eşleşenler | “Her satışın ürün bilgisi ne?” | JoinKind.LeftOuter |
| Sağ dış (Right outer) | Sağdaki tüm satırlar + soldan eşleşenler | “Her ürünün satışları neler?” | JoinKind.RightOuter |
| Tam dış (Full outer) | İki taraftaki tüm satırlar | “İki listeyi eksiksiz karşılaştır.” | JoinKind.FullOuter |
| İç (Inner) | Yalnızca iki tarafta da olanlar | “Sadece eşleşen kayıtlar.” | JoinKind.Inner |
| Sol karşıt (Left anti) | Solda olup sağda olmayanlar | “Listede olmayan ürün koduyla satış var mı?” | JoinKind.LeftAnti |
| Sağ karşıt (Right anti) | Sağda olup solda olmayanlar | “Hiç satılmamış ürün hangisi?” | JoinKind.RightAnti |
let
Satislar = Kaynak_Satislar,
Birlesik = Table.NestedJoin(Satislar, {"UrunNo"}, Urunler, {"UrunNo"},
"Urun", JoinKind.LeftOuter),
Acilmis = Table.ExpandTableColumn(Birlesik, "Urun", {"Urun", "Kategori"})
in
Acilmis
Karşıt birleştirmeler bir veri kalitesi denetimi olarak çok değerlidir. Sol karşıt sonucu boş değilse olgu tablosunda boyutta karşılığı olmayan anahtarlar var demektir; modelde bu satırlar görselde “(Boş)” satırına düşer. Sağ karşıt ise kullanılmayan boyut üyelerini bulur. Bizim modelimizde 40 üründen 2’si hiç satılmamıştır: Koşu Bandı ve Gurme Lokum Kutusu. 150 müşteriden 14’ünün de hiç siparişi yok.
Birleştirmeden sonra neden null geliyor?
Sol dış birleştirmeden sonra genişlettiğin sütunlar null doluysa eşleşme olmamıştır. Sık nedenler:
- Anahtar türü farklı. Bir tarafta
UrunNometin “7”, diğerinde sayı 7. Microsoft da eşleşen sütunların aynı veri türünde olması gerektiğini vurgular. Birleştirmeden önce iki tarafın türünü eşitle. - Görünmez boşluk ya da karakter. “E01 ” ile “E01” farklıdır. İki tarafı da Kırp ve Temizle.
- Büyük/küçük harf. Power Query metni harf duyarlı karşılaştırır: “ankara” ile “Ankara” eşleşmez. İki tarafı aynı biçime getir.
- Sütun sırası. Birden fazla sütunla birleştirirken iki tablodaki seçim sırası aynı olmalı: soldaki ilk seçilen sütun sağdaki ilk seçilenle eşleşir.
Bulanık eşleştirme
Anahtar yazımı tutarsız olduğunda (“Anadolu Market AŞ” ile “Anadolu Market A.Ş.”) Birleştir penceresinde Birleştirme yapmak için bulanık eşleştirme kullan kutusunu işaretle. Bu yalnızca metin sütunlarında çalışır. Seçenekler:
- Benzerlik eşiği (Similarity threshold): 0 ile 1 arası, varsayılan 0,80. 1 tam eşleşme demektir.
- Büyük/küçük harfi yoksay ve Metin parçalarını birleştirerek eşleştir (“Micro soft” ile “Microsoft”).
- En fazla eşleşme sayısı: her satıra kaç aday döneceği.
- Dönüşüm tablosu:
FromveTosütunlu bir eşleme tablosu (“İst.” → “İstanbul”).
Table.FuzzyNestedJoin(Bayiler, {"Unvan"}, CariListe, {"Unvan"}, "Cari",
JoinKind.LeftOuter, [IgnoreCase = true, Threshold = 0.85])
Bulanık eşleştirme bir kurtarma aracıdır, kalıcı çözüm değildir. Sonuçları gözle kontrol et, eşiği yükselt ve kaynak sistemde ortak bir kod alanı iste.
Dizin sütunu ve gruplu sıra
Sütun ekle → Dizin sütunu (Index column) her satıra 0’dan ya da 1’den başlayan bir sıra numarası verir; “Özel” seçeneğiyle başlangıç ve artış belirlenir. Tek başına satır numarası verir. Asıl gücü, Gruplandırma ölçütü ile birleştiğinde ortaya çıkar: her kategori içinde ayrı sıra.
- Ürün listesini Kategori’ye göre grupla, işlem olarak Tüm satırlar (All rows) seç. Her kategori için içinde bir tablo taşıyan tek satır oluşur.
- Bu iç tabloları fiyata göre azalan sırala ve her birine dizin ekle.
- İç tabloları genişlet;
Sira = 1olan satırları filtrele.
let
Kaynak = Urunler,
Gruplu = Table.Group(Kaynak, {"Kategori"},
{{"Satirlar", each Table.AddIndexColumn(
Table.Sort(_, {{"Fiyat", Order.Descending}}), "Sira", 1, 1), type table}}),
Acilmis = Table.ExpandTableColumn(Gruplu, "Satirlar", {"Urun", "Fiyat", "Sira"}),
EnPahali = Table.SelectRows(Acilmis, each [Sira] = 1)
in
EnPahali
Kullanıcı arayüzü 2. adımı doğrudan sunmaz: grupladıktan sonra formül çubuğunda each _ kısmını each Table.AddIndexColumn(…) ile değiştirirsin. Sonuç yedi satırdır; her kategorinin en pahalı ürünü. Aynı sonucu modelde bir DAX sorgusuyla doğrulayabilirsin:
EVALUATE
FILTER(
Urunler,
VAR Kat = Urunler[Kategori]
RETURN Urunler[Fiyat] = MAXX(FILTER(ALL(Urunler), Urunler[Kategori] = Kat), Urunler[Fiyat])
)
Örneğin Spor’da Koşu Bandı (15.999 ₺), Elektronik’te 27" Monitör (7.499 ₺) gelir. Eşit fiyatlı iki ürün varsa DAX ikisini de döndürür, Power Query’deki dizin ise yalnızca birine 1 verir. İki yöntemin farkı bu bağ (tie) durumunda ortaya çıkar.
Sorguyu okunur tutmak
- Adımları yeniden adlandır. “Değiştirilen Tür1” yerine “Tutar sayıya çevrildi”. Uygulanan Adımlar listesinde adıma sağ tıkla → Yeniden adlandır.
- Açıklama ekle. Adıma sağ tıkla → Özellikler → Açıklama. Metin, adımın üzerine gelince ipucu olarak görünür; Gelişmiş Düzenleyici’de adımın üstünde
// yorumsatırı olarak durur. - Sorgu bağımlılıkları. Görünüm → Sorgu bağımlılıkları (Query dependencies) penceresi hangi sorgunun hangi kaynaktan ve hangi sorgudan beslendiğini bir ağaç olarak çizer. Bir kaynağın yolunu değiştirmeden önce neyin etkileneceğini burada gör.