Ana içeriğe geç
Kesit Power BI
Orta · Veri Hazırlama

Power Query: join türleri, dizin sütunu ve gruplu sıra

Altı birleştirme türü ve hangi soruya cevap verdikleri, birleştirmeden sonra null gelmesinin nedenleri, bulanık eşleştirme, dizin sütunu ve her grupta sıra numarası. Sonuçları DAX sorgusuyla doğrulama.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

“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ürHangi satırlar kalır?Cevapladığı soruM
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:

  1. Anahtar türü farklı. Bir tarafta UrunNo metin “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.
  2. Görünmez boşluk ya da karakter. “E01 ” ile “E01” farklıdır. İki tarafı da Kırp ve Temizle.
  3. 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.
  4. 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.
Satır çoğalmasıTers sorun da var: sağ tabloda anahtar yineleniyorsa soldaki her satır, eşleşen her kopya için bir kez tekrar eder. 1.620 satırlık satış tablosu ürün listesiyle birleştikten sonra 1.700 satır olduysa ürün listesinde yinelenen kod vardır ve toplamlar şişer. Birleştirmeden önce ve sonra satır sayısını karşılaştır; boyut tarafında anahtara göre Yinelenenleri kaldır.

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:

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.

  1. Ü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.
  2. Bu iç tabloları fiyata göre azalan sırala ve her birine dizin ekle.
  3. İç tabloları genişlet; Sira = 1 olan 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.

Sıra için DAX mı, Power Query mi?Sıra, kullanıcının seçimine göre değişmeliyse (dilimleyicide yıl seçince en çok satan ürün) DAX ölçüsü gerekir. Sabit bir özellikse (ürünün kategorisindeki fiyat sırası) Power Query’de bir kez hesaplamak daha ucuzdur.

Sorguyu okunur tutmak

Alıştırmalara geç (6)