DAX formüllerinizi geliştirmek için değişkenleri kullanın

Veri modelleyicisi olarak bazı DAX hesaplamalarını yazmak ve hatalarını ayıklamak zor olabilir. Karmaşık hesaplama gereksinimlerinin bileşik veya karmaşık ifadeler yazmayı gerektirdiği durumlarla sık karşılaşılır. Bileşik ifadeler iç içe birçok işlevin kullanılmasını ve bir olasılıkla ifade mantığının yeniden kullanılmasını içerebilir.

DAX formüllerinizde değişkenlerin kullanılması, daha karmaşık ve verimli hesaplamalar yazmanıza yardımcı olabilir. Değişkenler, performansı ve güvenilirliği ve okunabilirliği iyileştirebilir ve karmaşıklığı azaltabilir.

Bu makalede yıldan yıla (YoY) satış artışının örnek bir ölçüsünü kullanarak ilk üç avantajı göstereceğiz. (Örneğin, satış artışının formülü: dönem satışları, geçen yıla ait aynı dönem için daha az satış satışı, geçen yılın aynı dönem için satışa bölünür.)

Aşağıdaki ölçü tanımıyla başlayalım.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

Ölçü doğru sonucu üretir ama yine de şimdi bunun nasıl geliştirilebileceğini görelim.

Performansı geliştirme

Formülde "geçen yıl aynı dönemdeki" değeri hesaplayan ifadenin yinelendiğine dikkat edin. Bu formül verimsizdir çünkü Power BI'ın aynı ifadeyi iki kez hesaplamasını gerektirir. Ölçüm tanımı, varolan bir değişken kullanılarak daha verimli hale getirilebilir.

Aşağıdaki ölçü tanımı bir gelişmeyi temsil eder. "Geçen yıl aynı dönemdeki" sonucu SalesPriorYear adlı değişkene atamak için bir ifade kullanır. Bu değişken daha sonra RETURN ifadesinde iki kez kullanılır.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Ölçü doğru sonucu üretmeye devam eder ve bunu sorgu süresinin yarısı kadar bir zamanda yapar.

Okunabilirliği geliştirme

Önceki ölçü tanımında değişken adı seçiminin nasıl RETURN ifadesinin daha rahat anlaşılmasını sağladığına dikkat edin. İfade kısadır ve kendi kendini açıklar.

Hata ayıklamayı basitleştirme

Değişkenler formülde hata ayıklamanıza da yardımcı olabilir. Değişkene atanan ifadeyi test etmek için RETURN ifadesini geçici olarak yeniden yazıp çıkış olarak değişkeni alabilirsiniz.

Aşağıdaki ölçü tanımı yalnızca SalesPriorYear değişkenini döndürür. Hedeflenen RETURN ifadesini nasıl açıklama haline getirdiğine dikkat edin. Bu teknik sayesinde, hata ayıklama tamamlandığında bunu kolayca geri alabilirsiniz.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Karmaşıklığı azaltma

DAX'ın önceki sürümlerinde değişkenler henüz desteklenmiyordu. Dış filtre bağlamlarına başvurmak amacıyla EARLIER veya EARLIEST DAX işlevlerini kullanmak için yeni filtre bağlamları ekleyen karmaşık ifadeler gerekiyordu. Ne yazık ki veri modelleyicilerine bu işlevin anlaşılması ve kullanılması zor geldi.

Değişkenler her zaman RETURN ifadenizin uyguladığı filtrelerin dışında değerlendirilir. Bu nedenle değiştirilmiş bir filtre bağlamında değişken kullandığınızda, EARLIEST işleviyle aynı sonucu elde eder. Dolayısıyla EARLIER veya EARLIEST işlevlerini kullanmaktan kaçınabilirsiniz. Diğer bir deyişle artık daha az karmaşık ve anlaşılması daha kolay formüller yazabilirsiniz.

Aşağıdaki Subcategory tablosuna eklenen hesaplanmış sütun tanımını düşünün. Subcategory Sales sütununun değerleri temelinde her ürün alt kategorisi için bir derece hesaplar.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

EARLIER işlevi, geçerli satır bağlamındaSubcategory Sales sütun değerine başvurmak için kullanılır.

Hesaplanmış sütun tanımı EARLIER işlevi yerine bir değişken kullanılarak geliştirilebilir. CurrentSubcategorySales değişkeni geçerli satır bağlamındaSubcategory Sales sütun değerini depolar ve RETURN ifadesi bunu değiştirilmiş filtre bağlamı içinde kullanır.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1

Ayrıca bkz.