صيغ DAX التي يجب أن يعرفها كل مستخدم أعمال

إتقان 20 صيغة DAX أساسية لـ Power BI. الحساب، وذكاء الوقت، وRANKX، وانتقال السياق، والمكررات، وأمثلة عمل عملية.

E
ECOSIRE Research and Development Team
|17 مارس 202615 دقائق قراءة3.4k كلمات|

جزء من سلسلة Data Analytics & BI

اقرأ الدليل الكامل

صيغ DAX التي يجب أن يعرفها كل مستخدم أعمال

DAX (تعبيرات تحليل البيانات) هي لغة الصيغة التي تحول Power BI من أداة رسم بياني بسيطة إلى محرك تحليلي كامل. بينما تتعامل واجهة السحب والإفلات في Power BI مع التجميعات الأساسية، فإن ذكاء الأعمال الحقيقي يتطلب DAX. تعتمد المقارنات السنوية، والمتوسطات المتدرجة، والتصنيفات، وسيناريوهات ماذا لو، ومؤشرات الأداء الرئيسية المعقدة جميعها على صيغ DAX.

يكمن التحدي في أن DAX يبدو بسيطًا بشكل مخادع ولكنه يتصرف بطرق تفاجئ حتى مستخدمي Excel ذوي الخبرة. تعد مفاهيم سياق عامل التصفية وسياق الصف وانتقال السياق فريدة بالنسبة لـ DAX وليس لها مكافئ مباشر في Excel أو SQL. يركز هذا الدليل على أكثر 20 صيغة DAX عملية لمستخدمي الأعمال، مع أمثلة واقعية يمكنك التكيف معها على الفور.


الوجبات السريعة الرئيسية

  • CALCULATE هي وظيفة DAX الأكثر أهمية --- فهي تعدل سياق عامل التصفية وتستخدم في أكثر من 80 بالمائة من المقاييس غير التافهة
  • تتطلب وظائف تحليل الوقت (TOTALYTD، SAMEPERIODLASTYEAR، DATEADD) جدول تاريخ مناسب تم وضع علامة عليه على هذا النحو في النموذج
  • بناء جملة VAR/RETURN يجعل المقاييس المعقدة قابلة للقراءة ويتجنب الحسابات الزائدة عن الحاجة
  • تقوم وظائف التكرار (SUMX، AVERAGEX، RANKX) بتقييم التعبيرات صفًا تلو الآخر، بينما تعمل المجمعات (SUM، AVERAGE) على الأعمدة
  • يحدث انتقال السياق عندما يستدعي عمود محسوب أو مكرر مقياسًا، مما يحول سياق الصف إلى سياق عامل التصفية
  • يستبدل SWITCH(TRUE(), ...) عبارات IF المتداخلة وهو أكثر قابلية للقراءة
  • يتحكم كل من ALL، وALLEXCEPT، وREMOVEFILTERS في المرشحات النشطة --- ولكن كن حذرًا فيما يتعلق بتأثيرات RLS

الأساس: سياق التصفية وسياق الصف

قبل الغوص في الصيغ، من الضروري فهم هذين المفهومين. يتم تتبع كل التباس في DAX لتصفية السياق وسياق الصف.

سياق التصفية

سياق عامل التصفية هو مجموعة عوامل التصفية المطبقة على عملية حسابية. إنها تأتي من شرائح البيانات، والمرشحات المرئية، ومرشحات الصفحات، ومرشحات التقارير، وRLS. عند وضع مقياس في مصفوفة مرئية مع "السنة" في الصفوف و"المنطقة" في الأعمدة، يكون لكل خلية سياق مرشح فريد: (السنة = 2025، المنطقة = أمريكا الشمالية)، (السنة = 2025، المنطقة = EMEA)، وما إلى ذلك.

يتم تقييم كل دالة تجميع DAX (SUM، AVERAGE، COUNT، MIN، MAX) ضمن سياق عامل التصفية الحالي. SUM(Sales[Revenue]) في خلية تمت تصفيتها إلى 2025 + أمريكا الشمالية يجمع فقط صفوف الإيرادات التي تطابق كلا الشرطين.

سياق الصف

يوجد سياق الصف داخل الأعمدة المحسوبة ووظائف التكرار. وهذا يعني "الصف الحالي." في عمود محسوب في جدول المبيعات، يتم تقييم Sales[Revenue] * Sales[Quantity] لكل صف على حدة.

انتقال السياق

عندما تستدعي دالة مكررة (مثل SUMX) مقياسًا، يتم تحويل سياق الصف تلقائيًا إلى سياق عامل التصفية. وهذا ما يسمى انتقال السياق. إنها قوية ولكنها يمكن أن تكون مصدرًا لمشاكل الأداء في حالة إساءة استخدامها.

-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
    Products,
    [Total Revenue]  -- This measure is evaluated in filter context
                     -- where the current product's ID filters the Sales table
)

إن فهم هذه المفاهيم يجعل كل صيغة DAX بديهية. بدونها، تبدو صيغ DAX وكأنها مربعات سوداء.


الصيغ الأساسية العشرين

1. الحساب — تعديل سياق التصفية

CALCULATE هي دالة DAX الأكثر أهمية. يقوم بتقييم تعبير في سياق عامل التصفية المعدل.

** بناء الجملة: ** CALCULATE(expression, filter1, filter2, ...)

مثال: الإيرادات من الطلبات الكبيرة فقط

Large Order Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Sales[OrderTotal] > 10000
)

مثال: الإيرادات من فئة منتج معينة

Electronics Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Products[Category] = "Electronics"
)

يستبدل الخيار CALCULATE عامل التصفية الموجود في العمود المحدد. إذا كانت أداة تقسيم البيانات تقوم بالفعل بتصفية الفئة إلى "الملابس"، فإن مقياس إيرادات الإلكترونيات يتجاهل أداة تقسيم البيانات هذه ويعرض إيرادات الإلكترونيات لأن CALCULATE يتجاوز عامل تصفية الفئة.

2. التصفية — التصفية على مستوى الصف

تقوم الدالة FILTER بإرجاع جدول تمت تصفيته حسب الشرط. يتم استخدامه غالبًا داخل CALCULATE للتصفية المعقدة التي لا يمكن التعبير عنها كمقارنة أعمدة بسيطة.

** بناء الجملة: ** FILTER(table, condition)

مثال: الإيرادات من العملاء الذين لديهم أكثر من 5 طلبات

Revenue From Repeat Customers =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        Customers,
        CALCULATE(COUNTROWS(Sales)) > 5
    )
)

هام: يقوم FILTER بتكرار صف تلو الآخر، مما يجعله أبطأ من مرشحات CALCULATE البسيطة على الجداول الكبيرة. استخدمه فقط عندما يكون مرشح العمود المباشر غير كافٍ.

3. الكل — إزالة جميع عوامل التصفية

يؤدي الدالة ALL إلى إزالة كافة عوامل التصفية من جدول أو عمود، مما يؤدي إلى إرجاع الجدول الذي لم تتم تصفيته بالكامل. يتم استخدامه لحساب الإجماليات والنسب المئوية للمجموع والنسب.

بناء الجملة: ALL(table) أو ALL(table[column])

مثال: الإيرادات كنسبة مئوية من الإجمالي

Revenue % of Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)

عند تصفية مقسم طريقة العرض إلى "أمريكا الشمالية"، يقوم SUM(Sales[Revenue]) بإرجاع إيرادات أمريكا الشمالية. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) يزيل جميع عوامل التصفية ويعيد الإيرادات العالمية. القسمة تعطي النسبة المئوية.

4. ALLEXCEPT — إزالة جميع عوامل التصفية باستثناء ما هو محدد

يقوم ALLEXCEPT بإزالة كافة عوامل التصفية من الجدول باستثناء الأعمدة المحددة. يكون هذا مفيدًا عندما تريد الاحتفاظ ببعض المرشحات (مثل السنة) أثناء إزالة مرشحات أخرى (مثل فئة المنتج).

** بناء الجملة: ** ALLEXCEPT(table, column1, column2, ...)

مثال: حصة الإيرادات خلال العام الحالي

Revenue % of Year Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(
        SUM(Sales[Revenue]),
        ALLEXCEPT(Sales, DateTable[Year])
    )
)

يعرض هذا حصة كل منتج أو منطقة من الإيرادات خلال السنة المحددة، وليس عبر جميع الأوقات.

5. TOTALYTD — منذ بداية العام وحتى تاريخه

يقوم TOTALYTD بحساب الإجمالي الجاري من بداية العام إلى التاريخ الحالي في السياق.

** بناء الجملة: ** TOTALYTD(expression, dates[date_column], [filter], [year_end_date])

مثال: إيرادات العام حتى تاريخه

Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

مع انتهاء السنة المالية في 30 يونيو:

Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")

المتطلب السابق: يجب وضع علامة على DateTable كجدول تاريخ في النموذج (أدوات الجدول، ثم وضع علامة عليه كجدول تاريخ).

6. نفس الفترة الزمنية - سنة بعد سنة

تقوم الدالة SAMEPERIODLASTYEAR بإزاحة سياق التاريخ بمقدار سنة واحدة بالضبط.

** بناء الجملة: ** SAMEPERIODLASTYEAR(dates[date_column])

مثال: الإيرادات مقارنة بالعام الماضي

Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))

Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)

في المصفوفة الشهرية، يعرض كل صف إيرادات الشهر الحالي والشهر نفسه من العام السابق، إلى جانب نسبة النمو.

7. DATEADD — تحولات زمنية مرنة

يقوم DATEADD بإزاحة التواريخ بأي فاصل زمني: أيام، أو أشهر، أو أرباع، أو سنوات. إنها أكثر مرونة من SAMEPERIODLASTYEAR.

** بناء الجملة: ** DATEADD(dates[date_column], intervals, interval_type)

مثال: الإيرادات قبل 3 أشهر

Revenue 3 Months Ago =
CALCULATE(
    SUM(Sales[Revenue]),
    DATEADD(DateTable[Date], -3, MONTH)
)

مثال: الإيرادات المتجددة لمدة 12 شهرًا

Revenue Rolling 12M =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

8. RANKX — التصنيف الديناميكي

تقوم RANKX بتعيين تصنيف لكل عنصر بناءً على التعبير.

** بناء الجملة: ** RANKX(table, expression, [value], [order], [ties])

مثال: تصنيف المنتجات حسب الإيرادات

Product Revenue Rank =
RANKX(
    ALL(Products[ProductName]),
    [Total Revenue],
    ,
    DESC,
    DENSE
)

يوفر ALL(Products[ProductName]) قائمة كاملة بالمنتجات التي سيتم التصنيف وفقًا لها، بغض النظر عن عوامل تصفية شرائح البيانات على المنتجات. DESC يعني أن أعلى إيرادات تحصل على المرتبة 1. DENSE تعني أن القيم المرتبطة تحصل على نفس المرتبة.

مثال: مرشح Top N

Top 10 Products Revenue =
CALCULATE(
    [Total Revenue],
    FILTER(
        ALL(Products[ProductName]),
        RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
    )
)

9. سويتش - المنطق الشرطي

يستبدل SWITCH عبارات IF المتداخلة وهو أكثر قابلية للقراءة.

** بناء الجملة: ** SWITCH(expression, value1, result1, value2, result2, ..., else_result)

مثال: تصنيف شريحة العملاء

Customer Segment =
SWITCH(
    TRUE(),
    [Total Revenue] > 100000, "Enterprise",
    [Total Revenue] > 25000, "Mid-Market",
    [Total Revenue] > 5000, "SMB",
    "Startup"
)

مثال: اختيار القياس الديناميكي

Selected Measure =
SWITCH(
    SELECTEDVALUE(MeasureSelector[Measure]),
    "Revenue", [Total Revenue],
    "Orders", [Order Count],
    "AOV", [Average Order Value],
    "Margin", [Gross Margin %],
    [Total Revenue]
)

يعمل هذا النمط مع مقسم شرائح يتيح للمستخدمين اختيار المقياس الذي سيتم عرضه في المخطط.

10. تقنية VAR / العودة – المتغيرات

تقوم المتغيرات بتخزين النتائج المتوسطة، مما يجعل الصيغ قابلة للقراءة وتجنب الحسابات الزائدة عن الحاجة. يتم تقييم المتغير مرة واحدة وإعادة استخدامه.

** بناء الجملة: ** VAR name = expression RETURN final_expression

مثال: مؤشرات الأداء الرئيسية المعقدة ذات المتغيرات

Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
    DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
    SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
    SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
    SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
    RevenueScore + FrequencyScore + RecencyScore

بدون المتغيرات، ستكرر هذه الصيغة نفس الحسابات عدة مرات، مما يجعلها غير قابلة للقراءة وأبطأ.

11. DIVIDE — القسم الآمن

تتعامل الدالة DIVIDE مع القسمة على الصفر بأمان، مما يؤدي إلى إرجاع نتيجة بديلة محددة بدلاً من الخطأ.

** بناء الجملة: ** DIVIDE(numerator, denominator, [alternate_result])

مثال:

Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)

استخدم دائمًا DIVIDE بدلاً من عامل التشغيل / في المقاييس. يعرض عامل التشغيل / خطأً عند القسمة على صفر، مما يؤدي إلى كسر العناصر المرئية.

12. DISTINCTCOUNT — حساب القيم الفريدة

DISTINCTCOUNT يحسب عدد القيم الفريدة في العمود.

** بناء الجملة: ** DISTINCTCOUNT(column)

مثال: العملاء النشطين في الفترة

Active Customers =
DISTINCTCOUNT(Sales[CustomerID])

يقوم هذا بإحصاء العملاء الفريدين الذين أجروا عملية شراء واحدة على الأقل في سياق الفلتر الحالي (الشهر أو الربع المحدد أو ما إلى ذلك).

13. COUNTROWS — عد الصفوف في الجدول

يحسب COUNTROWS عدد الصفوف في الجدول، ويتم تصفيته اختياريًا.

** بناء الجملة: ** COUNTROWS(table)

مثال: عدد الطلبات

Order Count =
COUNTROWS(Sales)

Cancelled Orders =
CALCULATE(
    COUNTROWS(Sales),
    Sales[Status] = "Cancelled"
)

14. SUMX — مجموع صف تلو الآخر

SUMX عبارة عن مكرر يقوم بتقييم تعبير لكل صف ويجمع النتائج. يعد ذلك ضروريًا عندما تحتاج إلى مضاعفة الأعمدة قبل الجمع.

** بناء الجملة: ** SUMX(table, expression)

مثال: حساب المتوسط المرجح

Weighted Average Price =
DIVIDE(
    SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
    SUM(Sales[Quantity])
)

لا يمكن لـ SUM مضاعفة عمودين. تحتاج إلى SUMX لتقييم الكمية مرات UnitPrice لكل صف ثم جمع النتائج.

15. AVERAGEX — متوسط صف تلو الآخر

AVERAGEX هو الإصدار المكرر من AVERAGE.

** بناء الجملة: ** AVERAGEX(table, expression)

مثال: متوسط أيام الإغلاق

Average Days to Close =
AVERAGEX(
    Opportunities,
    DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)

16. MAXX وMINX — Iterator Min/Max

يعثر MAXX وMINX على الحد الأقصى أو الأدنى لقيمة التعبير الذي تم تقييمه صفًا تلو الآخر.

مثال: تاريخ الطلب الأخير لكل عميل

Most Recent Order =
MAXX(Sales, Sales[OrderDate])

Oldest Unpaid Invoice =
MINX(
    FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
    Invoices[InvoiceDate]
)

17. LOOKUPVALUE – مكافئة لـ VLOOKUP

تقوم LOOKUPVALUE باسترداد قيمة من جدول بناءً على معيار بحث واحد أو أكثر. وهو يعادل DAX لـ VLOOKUP الخاص ببرنامج Excel.

** بناء الجملة: ** LOOKUPVALUE(result_column, search_column, search_value, ...)

مثال:

Customer Region =
LOOKUPVALUE(
    Customers[Region],
    Customers[CustomerID], Sales[CustomerID]
)

ملاحظة: يتم استخدام LOOKUPVALUE عادةً في الأعمدة المحسوبة، وليس في المقاييس. في المقاييس، يُفضل استخدام RELATED (لعدد متعدد إلى واحد) أو RELATEDTABLE (لواحد إلى متعدد).

18. القيمة المحددة — احصل على قيمة أداة التقطيع الحالية

تقوم SELECTEDVALUE بإرجاع قيمة عمود عندما تكون هناك قيمة واحدة بالضبط في سياق عامل التصفية. إذا تم تحديد قيم متعددة، فسيتم إرجاع النتيجة البديلة.

** بناء الجملة: ** SELECTEDVALUE(column, [alternate_result])

مثال: عنوان ديناميكي

Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")

19. ISBLANK — التحقق من القيم الفارغة

يختبر ISBLANK ما إذا كانت القيمة فارغة (خالية/فارغة).

مثال: الطلبات بدون مندوب مبيعات معين

Unassigned Orders =
CALCULATE(
    COUNTROWS(Sales),
    ISBLANK(Sales[SalespersonID])
)

20. CONCATENATEX — تسلسل القيم من جدول

يتكرر CONCATENATEX عبر جدول ويسلسل القيم في سلسلة واحدة.

** بناء الجملة: ** CONCATENATEX(table, expression, [delimiter], [order_by], [order])

مثال: قائمة المنتجات التي اشتراها العميل

Products Purchased =
CONCATENATEX(
    VALUES(Products[ProductName]),
    Products[ProductName],
    ", ",
    Products[ProductName], ASC
)

في جدول تفاصيل العميل، يعرض هذا "المنتج أ، المنتج ب، المنتج ج" لكل عميل.


الغوص العميق في ذكاء الوقت

يعد الذكاء الزمني هو السبب الأكثر شيوعًا الذي يجعل مستخدمي الأعمال بحاجة إلى DAX. تتطلب وظائف تحليل الوقت في Power BI جدول تاريخ مخصصًا. فيما يلي مجموعة شاملة من مقاييس الوقت.

المتطلبات الأساسية: جدول التاريخ

يجب أن يحتوي النموذج الخاص بك على جدول تاريخ يحتوي على:

  • عمود تاريخ مستمر (بدون ثغرات) يغطي نطاق البيانات بالكامل
  • تم تحديد الجدول كجدول تاريخ (أدوات الجدول، ثم تحديد جدول التاريخ)
  • علاقة من عمود التاريخ في جدول التاريخ إلى عمود التاريخ في كل جدول حقائق

مقاييس استخبارات الوقت المشتركة

-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])

-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])

-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))

-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))

-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))

-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
    CALCULATE(SUM(Sales[Revenue]))
)

-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        ALL(DateTable[Date]),
        DateTable[Date] <= MAX(DateTable[Date])
    )
)

الاستخبارات الزمنية للسنة المالية

إذا كانت السنة المالية الخاصة بك لا تتماشى مع السنة التقويمية، فاستخدم المعلمة year_end_date الاختيارية:

-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")

-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESYTD(DateTable[Date], "3/31")
)

انتقال السياق: المحرك المخفي

انتقال السياق هو العملية التي يتم فيها تحويل سياق الصف (من عمود محسوب أو مكرر) إلى سياق عامل التصفية عند استدعاء مقياس. هذا هو المفهوم الأقوى والأكثر سوء فهم في DAX.

كيف يعمل

النظر في هذا الإجراء:

Total Revenue = SUM(Sales[Revenue])

وهذا العمود المحسوب في جدول المنتجات:

Product Revenue = [Total Revenue]

يوجد في العمود المحسوب سياق الصف (صف المنتج الحالي). عند استدعاء [Total Revenue]، يقوم انتقال السياق بتحويل سياق الصف إلى عامل تصفية: CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). والنتيجة هي الإيرادات لهذا المنتج المحدد.

الآثار المترتبة على الأداء

يضيف انتقال السياق حسابًا ضمنيًا حول استدعاء القياس. بالنسبة للطاولات الصغيرة، هذا لا يكاد يذكر. بالنسبة للطاولات الكبيرة ذات المقاييس المعقدة، يمكن أن تكون باهظة الثمن. تجنب استدعاء التدابير المعقدة داخل التكرارات على جداول كبيرة.

غير فعال:

-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
    Customers,
    [Revenue] - [COGS] - [Allocated Overhead]
)

أفضل:

-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]

سيناريوهات الأعمال العملية

السيناريو 1: تحليل ABC (تصنيف باريتو)

قم بتصنيف المنتجات إلى A (أعلى 80% من الإيرادات)، وB (الـ 15%) التالية، وC (أدنى 5%):

ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
    ADDCOLUMNS(
        ALL(Products[ProductName]),
        "@Revenue", [Total Revenue]
    )
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
    SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
    SWITCH(TRUE(),
        CumulativePct <= 0.8, "A",
        CumulativePct <= 0.95, "B",
        "C"
    )

السيناريو 2: تحليل الاحتفاظ الجماعي

تتبع عدد العملاء من كل مجموعة استحواذ يظلون نشطين بمرور الوقت:

Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
VAR ActiveCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
RETURN
    DIVIDE(ActiveCustomers, CohortCustomers, 0)

السيناريو 3: نقل الإجمالي السنوي (MAT)

يعمل الإجمالي السنوي المتحرك على تسهيل الموسمية من خلال جمع آخر 12 شهرًا كاملاً:

Revenue MAT =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
    CALCULATE(
        [Revenue MAT],
        DATEADD(DateTable[Date], -12, MONTH)
    )
RETURN
    DIVIDE(Current - Prior, Prior, 0)

Iterator vs Aggregator: متى يجب استخدام كل منهما

وظائف المجمع

SUM، AVERAGE، COUNT، MIN، MAX تعمل على عمود واحد. فهي سريعة لأن محرك التخزين يمكنه حلها مباشرةً من بيانات الأعمدة المضغوطة.

استخدم عندما: أنت بحاجة إلى تجميع بسيط لعمود واحد.

وظائف التكرار

تقوم SUMX وAVERAGEX وCOUNTX وMINX وMAXX وRANKX بتقييم صف التعبير تلو الآخر. إنها أكثر مرونة ولكنها أبطأ لأن محرك الصيغة يعالج كل صف.

استخدم عندما:

  • تحتاج إلى مضاعفة الأعمدة قبل التجميع (SUMX للحسابات الموزونة)
  • تحتاج إلى تطبيق شرط لكل صف (COUNTX مع IF)
  • تحتاج إلى ترتيب العناصر (RANKX)
  • يعتمد الحساب على قيم من الجداول المرتبطة التي تحتاج إلى تقييم على مستوى الصف

قاعدة الأداء الأساسية: إذا كان من الممكن تحقيق نفس النتيجة باستخدام أداة التجميع، فاستخدم أداة التجميع. استخدم التكرارات فقط عندما يكون التقييم صفًا تلو الآخر ضروريًا.


تصحيح أخطاء داكس

رسائل الخطأ الشائعة

خطأالسببإصلاح
"من المتوقع وجود قيمة واحدة للعمود X"يُرجع المقياس قيمًا متعددة حيث يُتوقع وجود قيمة واحدةاستخدم SELECTEDVALUE أو MAX أو CALCULATE للتقليل إلى قيمة واحدة
"التبعية الدائرية"يشير عمودان أو مقاييس محسوبة إلى بعضها البعضأعد تصميم سلسلة الحساب لإزالة الدورة
"لا يمكن تحديد العلاقات"مسار علاقة غامض بين الجداولحدد العلاقة في USERELATIONSHIP أو قم بتنشيطها
"يشير التعبير إلى أعمدة متعددة"تم استخدام الكل/القيم مع أعمدة متعددة بشكل غير صحيحاستخدم ALL(Table) أو ALL(Table[Col1], Table[Col2])

محلل الأداء

يعرض محلل أداء Power BI Desktop (العرض، ثم محلل الأداء) استعلام DAX ووقت التنفيذ لكل مرئي. استخدامه ل:

  1. تحديد العناصر المرئية البطيئة (أكثر من ثانية واحدة)
  2. انسخ استعلام DAX إلى DAX Studio للحصول على تحليل مفصل
  3. قارن بين أوقات التنفيذ قبل/بعده عند تحسين التدابير

ستوديو داكس

DAX Studio هي أداة خارجية مجانية توفر تحليلاً تفصيليًا للاستعلام. يظهر:

  • استعلامات محرك التخزين (عمليات مسح سريعة لمخزن الأعمدة)
  • استعلامات محرك الصيغة (أبطأ، تقييم صف تلو الآخر)
  • أحجام التجسيد (خلط البيانات بين المحركات)

إذا قام أحد المقاييس بإنشاء العديد من استعلامات محرك الصيغة، فمن المحتمل أنه يستخدم عددًا كبيرًا جدًا من التكرارات أو تعبيرات FILTER المعقدة. Refactor لدفع المزيد من العمل إلى محرك التخزين.

بالنسبة إلى تدريب Power BI الذي يغطي DAX بدءًا من الأساسيات وحتى التحسين المتقدم، يقدم ECOSIRE ورش عمل عملية مصممة خصيصًا لمجموعات البيانات المحددة وأسئلة العمل.


الأسئلة الشائعة

ما الفرق بين المقياس والعمود المحسوب؟

يتم تقييم المقياس في وقت الاستعلام ضمن سياق عامل التصفية الحالي. لا يضيف بيانات إلى الجدول --- بل يحسب القيمة ديناميكيًا. يتم تقييم العمود المحسوب في وقت تحديث البيانات وإضافة عمود فعلي إلى الجدول. استخدم مقاييس للتجميعات ومؤشرات الأداء الرئيسية التي تتغير بناءً على مقسمات طرق العرض وعوامل التصفية. استخدم الأعمدة المحسوبة للتصنيفات على مستوى الصف أو القيم التي يلزم استخدامها في مقسمات طرق العرض أو عوامل التصفية أو العلاقات. تُفضل المقاييس دائمًا تقريبًا لأنها لا تزيد من حجم النموذج.

لماذا يُظهر مقياسي منذ بداية العام قيمًا غير صحيحة؟

السبب الأكثر شيوعًا هو عدم تكوين جدول التاريخ بشكل صحيح. تحقق من ثلاثة أشياء: (1) لا يحتوي جدول التاريخ على أي فجوات --- يجب تضمين كل تاريخ من بداية بياناتك إلى الحاضر، (2) تم وضع علامة على الجدول كجدول تاريخ في Power BI (أدوات الجدول، ثم وضع علامة كجدول تاريخ)، و(3) أن تكون العلاقة بين جدول التاريخ وجدول الحقائق الخاص بك نشطة وتم تعيينها بشكل صحيح. تأكد أيضًا من أن عمود التاريخ الخاص بك لا يتضمن مكونًا زمنيًا يمنع المطابقة التامة.

متى يجب أن أستخدم CALCULATE مقابل FILTER؟

استخدم CALCULATE عندما يمكنك التعبير عن عامل التصفية كمقارنة أعمدة بسيطة (على سبيل المثال، Products[Category] = "Electronics"). يقوم CALCULATE بتحويل هذا إلى عامل تصفية فعال يمكن لمحرك التخزين تحسينه. استخدم عامل التصفية عندما تحتاج إلى شروط معقدة لكل صف على حدة تشير إلى أعمدة متعددة أو مقاييس اتصال (على سبيل المثال، تصفية العملاء حيث CALCULATE(COUNTROWS(Sales)) > 5). يعد FILTER مكررًا وأبطأ، لذا تفضل بناء جملة CALCULATE البسيط عندما يكون ذلك ممكنًا.

كيف يمكنني إنشاء إجمالي حالي أو مجموع تراكمي في DAX؟

استخدم CALCULATE مع عامل تصفية يتضمن كافة التواريخ حتى التاريخ الحالي: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). يؤدي هذا إلى إزالة عامل تصفية التاريخ الموجود (الكل) واستبداله بمرشح يتضمن كافة التواريخ من البداية وحتى التاريخ الأقصى في السياق الحالي. في المصفوفة الشهرية، يعرض كل صف الإجمالي التراكمي خلال ذلك الشهر.

هل يمكنني استخدام DAX لكتابة البيانات مرة أخرى إلى قاعدة البيانات؟

لا. DAX هي لغة استعلام للقراءة فقط. يمكنه حساب البيانات وتصفيتها وتحويلها للعرض، لكن لا يمكنه إدراج البيانات أو تحديثها أو حذفها في قاعدة البيانات المصدر. بالنسبة لسيناريوهات إعادة الكتابة، استخدم Power Apps المضمن في Power BI، أو استخدم تدفقات Power Automate التي يتم تشغيلها بواسطة تنبيهات Power BI. تضيف بعض أدوات الجهات الخارجية (Acterys وWriteback Manager) إمكانات إعادة الكتابة من خلال عناصر مرئية مخصصة.

E

بقلم

ECOSIRE Research and Development Team

بناء منتجات رقمية بمستوى المؤسسات في ECOSIRE. مشاركة رؤى حول تكاملات Odoo وأتمتة التجارة الإلكترونية وحلول الأعمال المدعومة بالذكاء الاصطناعي.

المزيد من Data Analytics & BI

الدليل الكامل لتطوير لوحة تحكم Power BI

تعرف على كيفية إنشاء لوحات معلومات Power BI فعالة باستخدام تصميم مؤشرات الأداء الرئيسية وأفضل الممارسات المرئية وصفحات التصفح والإشارات المرجعية وتخطيطات الأجهزة المحمولة وأمان RLS.

Power BI Embedded: إضافة التحليلات إلى تطبيقك

قم بتضمين تحليلات Power BI في تطبيق SaaS الخاص بك. يغطي المصادقة، وRLS متعدد المستأجرين، وحجم السعة، وJavaScript SDK، والموضوعات المخصصة، وتسعير النسيج.

الترحيل من Excel إلى Power BI: دليل خطوة بخطوة

الدليل الكامل للانتقال من Excel إلى Power BI يغطي ترجمة الصيغة وإنشاء نموذج البيانات وPower Query والتحقق من الصحة وإيقاف التشغيل.

الدليل الكامل لتكامل Power BI + Odoo

قم بتوصيل Power BI بـ Odoo ERP للحصول على تحليلات متقدمة. استعلامات PostgreSQL المباشرة، والجداول الرئيسية، ولوحات معلومات المبيعات/المخزون/الموارد البشرية، وإعداد التحديث المتزايد.

قياس عائد استثمار الذكاء الاصطناعي في الأعمال: إطار عمل فعال بالفعل

إطار عمل عملي لقياس عائد الاستثمار في الذكاء الاصطناعي يغطي المدخرات المباشرة ومكاسب الإنتاجية وتأثير الإيرادات والقيمة الإستراتيجية عبر الأقسام.

بناء لوحات معلومات التقارير المالية: مؤشرات الأداء الرئيسية والتصميم وتكامل تخطيط موارد المؤسسات (ERP).

تصميم لوحات معلومات التقارير المالية التي تقود القرارات. تعرف على مؤشرات الأداء الرئيسية التي يجب تتبعها، ومبادئ تصميم لوحة المعلومات، وأفضل ممارسات تكامل تخطيط موارد المؤسسات (ERP).

الدردشة على الواتساب