Switch

DAX'ın bazı fonksiyonları çok yaratıcı formüller yazmaya imkan sağlıyor: SWITCH fonksiyonu bunlardan biri. Özellikle başka fonksiyonlarla birlikte kullanıldığında, yaptığı iş neredeyse orijinal kullanım amacını aşıyor.

MSDN'e göre SWITCH fonksiyonunun orijinal kullanımı şöyle:

SWITCH   (deyim;
         değer  ; sonuç ; 
         değer  ; sonuç ;
         ...         ; 
         hiçbiri değilse sonuç)

Yani,  tek bir deyimi  (expression)  farklı değerler altında test edip, hangi "condition" doğru ise (true) ise o duruma ait sonucu döndürmemizi sağlıyor.

Bu açıdan iç içe geçmiş (nested) IF  fonksiyonuna benziyor. Örneklemek gerekirse, Tarih tablosuna İngilizce ay isimlerini eklemek istediğimizi varsayalım;

IF ile yazarsak

=
IF ([Ay #] = 1; "January";
    IF ([Ay #] = 2; "February";
        IF ([Ay #] = 3; "March";
            IF ([Ay #] = 4; "April";
                IF ([Ay #] = 5; "May";
                    IF ([Ay #] = 6; "June";
                        IF ([Ay #] = 7; "July";
                            IF ([Ay #] = 8; "August";
                                IF ([Ay #] = 9; "September";
                                    IF ([Ay #] = 10; "October";
                                        IF ( [Ay #] = 11; "November"; 
                                             IF ( [Ay #] = 12; "December";
                                                        "Unknown Month" ))))))))))))

SWITCH ile yazarsak

=
SWITCH (
    [Ay #];
    1; "January";
    2; "February";
    3; "March";
    4; "April";
    5; "May";
    6; "June";
    7; "July";
    8; "August";
    9; "September";
    10; "October";
    11; "November";
    12; "December";
    "Unknown Month"
)

Bu açıdan SWITCH fonksiyonu, iç içe geçmiş IF yapısının biraz daha kolay yazımı gibi. Tabiri caizse "sugar synxtax" 'ı.

Bir başka örnek yapalım:

Gerçekleşen satışlarla bütçeyi karşılaştıran bir [Realizasyon %] metriğimiz olsun ve gerçekleşme yüzdesine göre sonuçun nasıl olduğuna karar veriyor olalım:

Bütçe Değerlendirme :=
IF ([Realizasyon %] >= 0,8; "İyi";
   IF ( [Realizasyon %] >= 0,7; "Orta"; 
      IF ( [Realizasyon %] >= 0,6; "Kötü"; 
                                "Çok Kötü" ) )

** İç içe geçmiş IF yapısında "conditionlar"  sırayla  test edilir ve doğru olan (true olan)  ilk condition sonucu  geri döndürülür.

Aynı metriği SWITCH ile yazmaya çalışalım;

Bütçe Değerlendirme :=
SWITCH (
    [Realizasyon %] >= 0,8;"İyi"; 
    [Realizasyon %] >= 0,7;"Orta"; 
    [Realizasyon %] >= 0,6;"Kötü"; 
    "Çok Kötü"
)

Bu metriği bir matrise düşürdüğümüzde  hata mesajı alırız. : Çünkü tek bir deyimi değil, birden fazla deyimi test ediyoruz. Realizasyon %'sini farklı deyimler olarak yazdık.

SWITCH bizden ilk parametre olarak  tek bir deyim  istiyor. Fonksiyonu  kandırmak için  TRUE()  ile birlikte kullanalım

TRUE(), tek başına kullanıldığında "True" değerini döndüren basit bir fonksiyon.

Bütçe Değerlendirme :=
SWITCH (
    TRUE();
    [Realizasyon %] >= 0,8; "İyi";
    [Realizasyon %] >= 0,7; "Orta";
    [Realizasyon %] >= 0,6; "Kötü";
    "Çok Kötü"
)

SWITCH'e istediği tek deyimi vererek, ki her zaman "True" değerini döndürür, farklı "condition" 'lara göre farklı değerler döndürebildik.

Bu durumda MSDN tanımına şöyle bir ekleme yapılabilir:

=
SWITCH (
    TRUE ();
    deyim 1; değer 1;
    deyim 2; değer 2;
    deyim 3; değer 3;
    hiçbiri değilse sonuç)

Yukarıdaki kalıp, içiçe geçmiş IF'ler yazmaktan daha kolaydır, daha kolay debug edilir.

SWITCH fonksiyonunun VALUES(), SELECTED() ve UNICHAR() ile olan kombinasyonları da son derece kullanışlı.

Bunlardan UNICHAR() ile olana bir örnek yapalım:

Bütçe Durum := 
SWITCH (
    TRUE();
    [Realizasyon %] >= 0,8; UNICHAR(128077);
    [Realizasyon %] >= 0,7; UNICHAR(128528);
    [Realizasyon %] >= 0,6; UNICHAR(128681);
    UNICHAR(9940)
)

Realizasyon %'sine göre farklı karakterler döndürdük! Daha başka karakterler göstermek isterseniz gerekli unichar değerlerini bu sitede bulabilirsiniz.

Bir varyasyon daha yapalım benzer mantıkta, bu sefer içi dolu ve içi boş yıldız karakterlerini değere göre tekrarlayalım ve birleştirelim:

Yıldız := 
REPT ( UNICHAR ( 9733 ); [Realizasyon %] * 5 )
    & REPT ( UNICHAR ( 9734 ); 10 - [Realizasyon %] * 5 )

REPT fonksiyonu, ilk parametresinde verilen karakteri, ikinci parametresinde bulduğu sayı kadar tekrarlayan bir fonksiyon. "&" ile de bulduğu boş ve dolu yıldızları birleştirmiş olduk.

Yazıda kullanılan modeli ekteki linkten indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.

Yorum yapın

Yaklaşan Power BI Eğitimleri

Uçtan Uca Power BI, 14-15 Nisan

DAX ve Veri Modelleme, 28-29 Nisan