Sorguları birleştir (Merge)
İki tabloyu ortak bir sütun üzerinden yan yana getirir; SQL'deki JOIN'in karşılığıdır. Giriş → Sorguları Birleştir.
| Birleştirme türü | Sonuç |
|---|---|
| Sol dış | Soldaki tüm satırlar + sağdaki eşleşenler (en yaygın) |
| Sağ dış | Sağdaki tüm satırlar + soldaki eşleşenler |
| Tam dış | İki taraftaki tüm satırlar |
| İç | Yalnızca iki tarafta da eşleşenler |
| Sol karşıt (anti) | Solda olup sağda eşleşmeyenler (ör. hiç sipariş vermemiş müşteriler) |
| Sağ karşıt | Sağda olup solda eşleşmeyenler |
Birleştirmeden sonra yeni bir “tablo” sütunu oluşur; başlığındaki genişlet düğmesiyle istediğin sütunları seçersin.
Sorguları ekle (Append)
Aynı yapıdaki tabloları alt alta ekler (SQL'de UNION ALL). Her ay ayrı dosya gelen satış raporları için idealdir. Daha da iyisi: Klasör bağlayıcısı, bir klasördeki tüm dosyaları tek seferde birleştirir; klasöre yeni dosya eklendikçe yenilemede kendiliğinden gelir.
Özetten çıkar (Unpivot)
Excel'den gelen “Ocak | Şubat | Mart …” sütunlu bütçe tablosunu modele uygun hâle getirir:
| Kategori | Oca | Şub | Kategori | Ay | Hedef | |
|---|---|---|---|---|---|---|
| Kitap | 4.000 | 4.200 | → | Kitap | Oca | 4.000 |
| Spor | 6.500 | 6.100 | Kitap | Şub | 4.200 |
Kategori sütununu seç → Dönüştür → Diğer Sütunların Özetini Kaldır. Bu modeldeki Hedefler tablosu tam olarak bu biçimdedir.
Gruplandırma ve koşullu sütun
- Gruplandırma ölçütü: Satırları özetler (ör. müşteri başına sipariş sayısı). Modele daha küçük bir tablo yüklemek için kullanılır.
- Koşullu sütun: Sihirbazla “Eğer Fiyat > 1000 ise Pahalı” gibi kurallar. Hesaplanmış sütun yerine burada oluşturmak modeli verimli tutar.
- Örneklerden sütun: Birkaç örnek yazarsın, Power Query kuralı kendisi çıkarır.
Parametreler ve sorgu katlama
- Parametre: Sunucu adı, başlangıç tarihi gibi değerleri bir yerde tanımla; geliştirme ve canlı ortam arasında tek tıkla geçiş yap. Artımlı yenileme de
RangeStartveRangeEndparametrelerine dayanır. - Sorgu katlama (query folding): Adımların kaynak veritabanına tek bir SQL sorgusu olarak gönderilmesi. Filtre, sütun seçimi, gruplama gibi adımlar katlanır; işi veritabanı yapar. Bir adıma sağ tıklayıp Yerel Sorguyu Görüntüle ile kontrol edebilirsin. Katlamayı bozan adımları (ör. dizin sütunu) mümkün olduğunca sona koy.
Birleştir mi, ekle mi? İlk karar
Satış operasyonundan iki dosya geliyor: bayilerin Ocak satışları ve Şubat satışları. Bir de bayi listesi (bayi adı, bölge, açılış tarihi). Hangi dosya hangi işlemle gelir?
| Soru | İşlem | Sonuç |
|---|---|---|
| Aynı sütunlar, farklı dönem mi? | Ekle (Append) | Satır sayısı artar, sütunlar aynı kalır |
| Bir tabloya başka tablodan bilgi mi ekleniyor? | Birleştir (Merge) | Sütun sayısı artar; eşleşmeyen satır birleştirme türüne göre kalır ya da düşer |
Ocak + Şubat = Ekle. Satış + bayi bölgesi = Birleştir. Ama çoğu zaman birleştirmeye hiç gerek yoktur: bayi listesini ayrı bir boyut tablosu olarak yükleyip modelde ilişki kurmak, bölgeyi satış tablosuna kopyalamaktan daha temizdir. Birleştirmeyi; anahtar yoksa, iki kaynağı tek boyutta toplamak gerekiyorsa ya da bir arama tablosu modelde gereksiz kalacaksa kullan. Join türlerinin ayrıntısı ve birleştirme sonrası neden null geldiği Power Query ileri dersinde.
Eklemede sütun adı uyuşmazlığı
Ekleme sütunları sırasına göre değil adına göre eşler. Ocak dosyasında Tutar, Şubat dosyasında Tutar TL yazıyorsa sonuçta iki ayrı sütun oluşur: Ocak satırlarında Tutar TL null, Şubat satırlarında Tutar null. Toplam doğru gibi görünür ama her ölçü yarım çalışır. Önlem:
- Eklemeden önce her kaynakta sütunları aynı adla yeniden adlandır.
- Eklemeden sonra sütun profilinde (Görünüm → Sütun profili) beklenmedik null oranına bak.
- Klasörden birleştirmede örnek dosya dönüşümü tüm dosyalara uygulanır; adı farklı olan dosya bu dönüşümde hata verir ve sorun erken görünür.
Gruplandırmanın gelişmiş hâli
Gruplandırma ölçütü iletişim kutusunda Gelişmiş’i seçince birden çok gruplama sütunu ve birden çok toplama ekleyebilirsin: aynı adımda bayi başına toplam tutar, satır sayısı ve en son tarih. İşlem listesindeki Tüm satırlar seçeneği ise her grubu iç içe bir tablo olarak tutar; sonra her grubun içinden “en son satır” ya da “en büyük tutar” gibi bir seçim yapmak için kullanılır. Ama dikkat: modelde ayrıntıyı tutup DAX ile toplamak çoğu zaman daha esnektir. Gruplandırmayı, ayrıntının modelde hiç gerekmediği durumlar (ör. günlük ham log’u saatlik özete indirmek) için sakla.
Koşullu sütun ve arkasındaki M
Sütun ekle → Koşullu sütun. Sihirbaz koşulları yukarıdan aşağı dener ve ilk eşleşende durur. Bu yüzden sıra önemlidir: “Tutar > 1000 ise Büyük” koşulunu “Tutar > 2000 ise Çok büyük” koşulunun üstüne yazarsan 2.040 TL’lik bayi satırı “Büyük” olur. En dar koşulu en üste koy. Sihirbaz arka planda şu M’yi yazar:
= Table.AddColumn(Kaynak, "Satış Bandı", each
if [Tutar] = null then "Bilinmiyor"
else if [Tutar] > 2000 then "Çok büyük"
else if [Tutar] > 1000 then "Büyük"
else "Normal", type text)
null kontrolünü en başa koymak önemli: M’de bir tarafı null olan > karşılaştırması false değil null döner; if koşulu null olunca hücre “null değeri Logical türüne dönüştürülemez” hatası verir. Kontrol başta olursa boş tutarlı satır hata yerine açıkça “Bilinmiyor” gibi bir etikete düşer.
Hata yönetimi: adım hatası, hücre hatası
Power Query’de iki tür hata görürsün:
- Adım düzeyi hata: Sorgunun tamamı durur; ön izleme yerine sarı bir uyarı çıkar. Tipik neden: kaynak dosyanın yeri ya da bir sütunun adı değişmiş. Çözüm adımın formülünde.
- Hücre düzeyi hata: Tablo yüklenir ama bazı hücrelerde
Erroryazar. Tipik neden: “bilinmiyor” yazan bir tarih, “-” yazan bir tutar.
Hücre hatalarında dört yol var; seçim, hatanın iş anlamına bağlı:
| Yol | Ne yapar? | Ne zaman? |
|---|---|---|
| Hataları kaldır | Satırı atar | Satır anlamsızsa (test kaydı) |
| Hataları değiştir | Hücreye sabit değer yazar (null, 0) | Satır değerli, alan boş kalabilir |
| Hataları koru (Keep errors) | Yalnızca hatalı satırları bırakır | Ayrı bir “denetim” sorgusu: kaynak sahibine gönderilecek liste |
try … otherwise | Hata olursa yedek ifade | Birden çok olası biçim: önce bir yolu dene, olmazsa ötekini |
= Table.AddColumn(Kaynak, "Kayıt Tarihi", each
try Date.FromText([KayitTarihi], [Culture = "tr-TR"]) otherwise null, type date)