Aracılığıyla paylaş


DAX formüllerinizi geliştirmek için değişkenleri kullanma

Veri modelleyicisi olarak, bazı DAX hesaplamalarını yazmak ve hata ayıklamak zor olabilir. Karmaşık hesaplama gereksinimleri genellikle bileşik veya karmaşık ifadeler yazmayı kapsar. Bileşik ifadeler birçok iç içe işlevlerin kullanılmasını ve muhtemelen ifade mantığının yeniden kullanılmasını içerebilir.

DAX formüllerinizde değişkenleri kullanmak daha karmaşık ve verimli hesaplamalar yazmanıza yardımcı olabilir. Değişkenler performansı, güvenilirliği, okunabilirliği artırabilir ve karmaşıklığı azaltabilir.

Bu makalede, yıldan yıla (YoY) satış büyümesi için örnek bir ölçü kullanarak ilk üç avantajı göstereceğiz. (YoY satış büyümesi formülü, geçen yılın aynı dönemine ait satışlar eksi olan dönem satışlarıdır ve geçen yılın aynı dönemine ait satışlara 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 verir, ancak şimdi nasıl geliştirilebileceğini görelim.

Performansı geliştirme

Formülün "geçen yılın aynı dönemini" hesaplayan ifadeyi yinelediğini unutmayın. Power BI'ın aynı ifadeyi iki kez değerlendirmesi gerektirdiğinden bu formül verimsizdir. Var değişkeni kullanılarak ölçü tanımı daha verimli hale getirilebilir.

Aşağıdaki ölçü tanımı bir iyileştirmeyi temsil eder. "Geçen yılın aynı dönemi" sonucunu SalesPriorYear adlı bir değişkene atamak için bir ifade kullanır. 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 yaklaşık yarısında yapar.

Okunabilirliği geliştirme

Önceki ölçü tanımında değişken adı seçiminin RETURN ifadesinin anlaşılmasını nasıl daha kolay hale getirdiğine dikkat edin. İfade kısa ve kendi kendine açıklayıcıdır.

Hata ayıklamayı basitleştirme

Değişkenler formülde hata ayıklamanıza da yardımcı olabilir. Bir değişkene atanan bir ifadeyi test etmek için, değişken çıkışı için RETURN ifadesini geçici olarak yeniden yazarsınız.

Aşağıdaki ölçü tanımı yalnızca SalesPriorYear değişkenini döndürür. Hedeflenen RETURN ifadesini açıklama olarak açıklama şekline dikkat edin. Bu teknik, hata ayıklama işlemi tamamlandıktan sonra kolayca geri döndürmenizi sağlar.

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

Karmaşıklığı azaltın

DAX'ın önceki sürümlerinde değişkenler henüz desteklenmiyordu. Dış filtre bağlamlarına başvurmak için EARLIER veya EARLIEST DAX işlevlerini kullanmak için yeni filtre bağlamları getiren karmaşık ifadeler gerekiyordu. Ne yazık ki, veri modelleyicileri bu işlevleri anlamak ve kullanmakta zor buldu.

Değişkenler her zaman RETURN ifadenizin uyguladığı filtrelerin dışında değerlendirilir. Bu nedenle, değiştirilmiş bir filtre bağlamında bir değişken kullandığınızda, EARLIEST işleviyle aynı sonucu elde eder. Bu nedenle EARLIER veya EARLIEST işlevlerinin kullanılması önlenebilir. Bu, artık daha az karmaşık ve anlaşılması daha kolay formüller yazabileceğiniz anlamına gelir.

Alt Kategori tablosuna eklenen aşağıdaki hesaplanmış sütun tanımını göz önünde bulundurun. Alt Kategori Satışları sütun değerlerine göre her bir ürün alt kategorisi için bir derecelendirme değerlendirir.

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

EARLIER işlevi, geçerli satır bağlamındaki Alt Kategori Satışları sütun değerine başvurmak için kullanılır.

Hesaplanan sütun tanımı EARLIER işlevi yerine bir değişken kullanılarak geliştirilebilir. CurrentSubcategorySales değişkeni, Alt Kategori Satışları sütun değerini geçerli satır bağlamında depolar ve RETURN ifadesi bunu değiştirilmiş bir filtre bağlamında kullanır.

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