DAX Formulas Every Business User Should Know

Master 20 essential DAX formulas for Power BI. CALCULATE, time intelligence, RANKX, context transition, iterators, and practical business examples.

E
ECOSIRE Research and Development Team
|17 مارچ، 202619 منٹ پڑھیں4.2k الفاظ|

ہماری Data Analytics & BI سیریز کا حصہ

مکمل گائیڈ پڑھیں

DAX فارمولے ہر کاروباری صارف کو معلوم ہونا چاہیے۔

DAX (Data Analysis Expressions) وہ فارمولہ زبان ہے جو Power BI کو ایک سادہ چارٹنگ ٹول سے ایک مکمل تجزیاتی انجن میں تبدیل کرتی ہے۔ جبکہ پاور BI کا ڈریگ اینڈ ڈراپ انٹرفیس بنیادی مجموعوں کو ہینڈل کرتا ہے، حقیقی کاروباری ذہانت کے لیے DAX کی ضرورت ہوتی ہے۔ سال بہ سال موازنہ، رولنگ اوسط، درجہ بندی، کیا ہو تو منظرنامے، اور پیچیدہ KPIs سبھی DAX فارمولوں پر منحصر ہیں۔

چیلنج یہ ہے کہ DAX دھوکہ دہی سے سادہ نظر آتا ہے لیکن ایسا برتاؤ کرتا ہے جو تجربہ کار Excel صارفین کو بھی حیران کر دیتا ہے۔ فلٹر سیاق و سباق، قطار سیاق و سباق، اور سیاق و سباق کی منتقلی کے تصورات DAX کے لیے منفرد ہیں اور Excel یا SQL میں ان کا کوئی براہ راست مساوی نہیں ہے۔ یہ گائیڈ کاروباری صارفین کے لیے 20 سب سے زیادہ عملی DAX فارمولوں پر مرکوز ہے، حقیقی دنیا کی مثالوں کے ساتھ آپ فوری طور پر اپنا سکتے ہیں۔


اہم نکات

  • CALCULATE واحد سب سے اہم DAX فنکشن ہے --- یہ فلٹر کے سیاق و سباق کو تبدیل کرتا ہے اور 80 فیصد سے زیادہ غیر معمولی اقدامات میں استعمال ہوتا ہے۔
  • ٹائم انٹیلیجنس فنکشنز (TOTALYTD، SAMEPERIODLASTYEAR، DATEADD) کے لیے ماڈل میں نشان زد ایک مناسب تاریخ کی میز کی ضرورت ہوتی ہے
  • VAR/RETURN نحو پیچیدہ اقدامات کو پڑھنے کے قابل بناتا ہے اور فالتو حساب سے بچتا ہے۔
  • Iterator فنکشنز (SUMX، AVERAGEX، RANKX) قطار در قطار اظہار کی تشخیص کرتے ہیں، جبکہ جمع کرنے والے (SUM، AVERAGE) کالموں پر کام کرتے ہیں
  • سیاق و سباق کی منتقلی اس وقت ہوتی ہے جب ایک حساب شدہ کالم یا تکرار کنندہ ایک پیمائش کو کال کرتا ہے، قطار کے سیاق و سباق کو فلٹر سیاق و سباق میں تبدیل کرتا ہے۔
  • SWITCH(TRUE(), ...) نیسٹڈ IF بیانات کی جگہ لے لیتا ہے اور کہیں زیادہ پڑھنے کے قابل ہے۔
  • تمام، تمام، اور ہٹانے والے فلٹرز کنٹرول کرتے ہیں کہ کون سے فلٹرز فعال ہیں --- لیکن RLS مضمرات سے محتاط رہیں

فاؤنڈیشن: فلٹر سیاق و سباق اور قطار سیاق و سباق

فارمولوں میں غوطہ لگانے سے پہلے، ان دو تصورات کو سمجھنا ضروری ہے۔ DAX میں ہر الجھن فلٹر سیاق و سباق اور قطار کے سیاق و سباق کی طرف واپس آتی ہے۔

سیاق و سباق کو فلٹر کریں۔

فلٹر سیاق و سباق ایک حساب پر لاگو فلٹرز کا سیٹ ہے۔ یہ سلائسرز، ویژول فلٹرز، پیج فلٹرز، رپورٹ فلٹرز اور RLS سے آتا ہے۔ جب آپ میٹرکس ویژول میں قطاروں پر "سال" اور کالموں پر "علاقہ" کے ساتھ پیمائش کرتے ہیں، تو ہر سیل کا ایک منفرد فلٹر سیاق و سباق ہوتا ہے: (سال = 2025، علاقہ = شمالی امریکہ)، (سال = 2025، علاقہ = EMEA)، وغیرہ۔

ہر DAX ایگریگیشن فنکشن (SUM, AVERAGE, COUNT, MIN, MAX) موجودہ فلٹر سیاق و سباق کے اندر جائزہ لیتا ہے۔ 2025 + شمالی امریکہ میں فلٹر کردہ سیل میں SUM(Sales[Revenue]) دونوں شرائط سے مماثل آمدنی کی قطاروں کو صرف کرتا ہے۔

قطار کا سیاق و سباق

قطار کا سیاق و سباق حساب شدہ کالموں اور تکرار کرنے والے افعال کے اندر موجود ہے۔ اس کا مطلب ہے "موجودہ قطار"۔ سیلز ٹیبل پر ایک حسابی کالم میں، 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 فارمولے بلیک بکس کی طرح محسوس ہوتے ہیں۔


20 ضروری فارمولے۔

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
    )
)

اہم: فلٹر قطار در قطار اعادہ کرتا ہے، اسے بڑی میزوں پر سادہ کیلکولیٹ فلٹرز سے سست بناتا ہے۔ اسے صرف اس وقت استعمال کریں جب ڈائریکٹ کالم فلٹر ناکافی ہو۔

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")

پیشگی شرط: ڈیٹ ٹیبل کو ماڈل میں ڈیٹ ٹیبل کے طور پر نشان زد کیا جانا چاہیے (ٹیبل ٹولز، پھر بطور ڈیٹ ٹیبل نشان زد کریں)۔

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 ملتا ہے۔

مثال: ٹاپ این فلٹر

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

9. سوئچ — مشروط منطق

سوئچ نیسٹڈ 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

مثال: متغیرات کے ساتھ پیچیدہ KPI

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. تقسیم — محفوظ ڈویژن

DVIDE ایک غلطی کی بجائے ایک متعین متبادل نتیجہ واپس کرتے ہوئے، صفر سے تقسیم کو احسن طریقے سے ہینڈل کرتا ہے۔

نحو: 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 کی ضرورت ہے اور پھر نتائج کا خلاصہ کریں۔

15. AVERAGEX — قطار در قطار اوسط

AVERAGEX AVERAGE کا تکرار کرنے والا ورژن ہے۔

نحو: AVERAGEX(table, expression)

مثال: بند ہونے کے اوسط دن

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

16. MAXX اور MINX — دوبارہ کرنے والا کم سے کم/زیادہ سے زیادہ

MAXX اور MINX قطار در قطار ایک اظہار کی زیادہ سے زیادہ یا کم از کم قدر تلاش کرتے ہیں۔

مثال: تازہ ترین آرڈر کی تاریخ فی گاہک

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

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

17. LOOKUPVALUE — VLOOKUP ایکوئیلنٹ

LOOKUPVALUE ایک یا زیادہ تلاش کے معیار پر مبنی ٹیبل سے ایک قدر بازیافت کرتا ہے۔ یہ ایکسل کے VLOOKUP کے DAX کے برابر ہے۔

نحو: LOOKUPVALUE(result_column, search_column, search_value, ...)

مثال:

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

نوٹ: LOOKUPVALUE عام طور پر حسابی کالموں میں استعمال ہوتا ہے، پیمائش میں نہیں۔ اقدامات میں، RELATED (بہت سے ایک کے لیے) یا RELATEDTABLE (ایک سے کئی کے لیے) کو ترجیح دی جاتی ہے۔

18. SELECTEDVALUE — موجودہ سلائیسر ویلیو حاصل کریں۔

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
)

گاہک کی تفصیل کے جدول میں، یہ ہر گاہک کے لیے "پروڈکٹ A، پروڈکٹ B، پروڈکٹ C" دکھاتا ہے۔


ٹائم انٹیلی جنس گہرا غوطہ

کاروباری صارفین کو DAX کی ضرورت کی سب سے عام وجہ وقت کی ذہانت ہے۔ پاور 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>)۔ نتیجہ اس مخصوص پروڈکٹ کی آمدنی ہے۔

کارکردگی کے مضمرات

سیاق و سباق کی منتقلی پیمائش کال کے ارد گرد ایک مضمر CALCULATE کا اضافہ کرتی ہے۔ چھوٹی میزوں کے لیے، یہ نہ ہونے کے برابر ہے۔ پیچیدہ اقدامات کے ساتھ بڑی میزوں کے لئے، یہ مہنگا ہو سکتا ہے. بڑی میزوں پر تکرار کرنے والوں کے اندر پیچیدہ اقدامات کو کال کرنے سے گریز کریں۔

ناکارہ:

-- 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)

ایٹریٹر بمقابلہ ایگریگیٹر: ہر ایک کو کب استعمال کرنا ہے۔

جمع کرنے والے افعال

SUM, AVERAGE, COUNT, MIN, MAX ایک کالم پر کام کرتے ہیں۔ وہ تیز ہیں کیونکہ اسٹوریج انجن انہیں کمپریسڈ کالم ڈیٹا سے براہ راست حل کر سکتا ہے۔

استعمال کریں جب: آپ کو ایک کالم کا سادہ مجموعہ درکار ہے۔

تکرار کرنے والے افعال

SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX ایک قطار در قطار اظہار کا اندازہ لگاتے ہیں۔ وہ زیادہ لچکدار لیکن سست ہیں کیونکہ فارمولا انجن ہر قطار پر کارروائی کرتا ہے۔

استعمال کریں جب:

  • آپ کو جمع کرنے سے پہلے کالموں کو ضرب دینے کی ضرورت ہے (وزن والے حسابات کے لیے SUMX)
  • آپ کو فی قطار ایک شرط لگانے کی ضرورت ہے (IF کے ساتھ COUNTX)
  • آپ کو اشیاء کی درجہ بندی کرنے کی ضرورت ہے (RANKX)
  • حساب کا انحصار متعلقہ جدولوں کی قدروں پر ہوتا ہے جنہیں قطار کی سطح کی تشخیص کی ضرورت ہوتی ہے۔

کارکردگی کا اصول: اگر یہی نتیجہ ایک ایگریگیٹر سے حاصل کیا جا سکتا ہے تو ایگریگیٹر کا استعمال کریں۔ تکرار کرنے والوں کو صرف اس وقت استعمال کریں جب قطار در قطار تشخیص ضروری ہو۔


ڈیبگنگ DAX

عام خرابی کے پیغامات

خرابیوجہدرست کریں
"کالم X کے لیے ایک ہی قدر متوقع ہے"پیمائش متعدد اقدار کو لوٹاتا ہے جہاں ایک کی توقع کی جاتی ہےایک قدر کو کم کرنے کے لیے SELECTEDVALUE، MAX، یا CALCULATE استعمال کریں۔
"سرکلر انحصار"دو حسابی کالم یا پیمائش ایک دوسرے کا حوالہ دیتے ہیںسائیکل کو ہٹانے کے لیے کیلکولیشن چین کو دوبارہ ڈیزائن کریں
"رشتوں کا تعین نہیں کر سکتے"میزوں کے درمیان مبہم تعلقات کا راستہUSERELATIONSHIP میں تعلق کی وضاحت کریں یا اسے فعال کریں
"اظہار متعدد کالموں سے مراد ہے"ALL/VALUES ایک سے زیادہ کالموں کے ساتھ غلط استعمال کیا جاتا ہے۔ استعمال کریں ALL(Table) یا ALL(Table[Col1], Table[Col2])

کارکردگی کا تجزیہ کرنے والا

پاور BI ڈیسک ٹاپ کا پرفارمنس اینالائزر (دیکھیں، پھر پرفارمنس اینالائزر) ہر بصری کے لیے DAX استفسار اور عمل درآمد کا وقت دکھاتا ہے۔ اسے استعمال کریں:

  1. سست بصری کی شناخت کریں (1 سیکنڈ سے زیادہ)
  2. تفصیلی تجزیہ کے لیے DAX استفسار کو DAX Studio میں کاپی کریں۔
  3. اقدامات کو بہتر بناتے وقت عملدرآمد کے اوقات سے پہلے/بعد کا موازنہ کریں۔

DAX اسٹوڈیو

DAX اسٹوڈیو ایک مفت بیرونی ٹول ہے جو استفسار کا تفصیلی تجزیہ فراہم کرتا ہے۔ یہ ظاہر کرتا ہے:

  • اسٹوریج انجن کے سوالات (تیز، کالم اسٹور اسکین)
  • فارمولہ انجن کے سوالات (سست، قطار در قطار تشخیص)
  • میٹریلائزیشن سائز (انجنوں کے درمیان ڈیٹا شفل کیا گیا)

اگر کوئی پیمائش بہت سارے فارمولہ انجن کے سوالات پیدا کرتی ہے، تو یہ ممکنہ طور پر بہت زیادہ تکرار کرنے والے یا پیچیدہ FILTER اظہارات کا استعمال کرتا ہے۔ سٹوریج انجن پر مزید کام کرنے کے لیے ریفیکٹر۔

Power BI ٹریننگ کے لیے جو DAX کو ایڈوانسڈ آپٹیمائزیشن کے ذریعے بنیادی اصولوں سے کور کرتی ہے، ECOSIRE آپ کے مخصوص ڈیٹا سیٹس اور کاروباری سوالات کے مطابق تیار کردہ ہینڈ آن ورکشاپس پیش کرتا ہے۔


اکثر پوچھے گئے سوالات

پیمائش اور حسابی کالم میں کیا فرق ہے؟

موجودہ فلٹر سیاق و سباق کے اندر استفسار کے وقت ایک پیمائش کا اندازہ کیا جاتا ہے۔ یہ ٹیبل میں ڈیٹا شامل نہیں کرتا ہے --- یہ متحرک طور پر ایک قدر کی گنتی کرتا ہے۔ ایک حسابی کالم کا ڈیٹا ریفریش وقت پر جائزہ لیا جاتا ہے اور ٹیبل میں ایک فزیکل کالم شامل کرتا ہے۔ مجموعوں اور KPIs کے لیے اقدامات استعمال کریں جو سلائسرز اور فلٹرز کی بنیاد پر تبدیل ہوتے ہیں۔ قطار کی سطح کی درجہ بندیوں یا قدروں کے لیے حسابی کالم استعمال کریں جنہیں سلائسرز، فلٹرز یا رشتوں میں استعمال کرنے کی ضرورت ہے۔ اقدامات کو ہمیشہ ترجیح دی جاتی ہے کیونکہ وہ ماڈل کے سائز میں اضافہ نہیں کرتے ہیں۔

میری YTD پیمائش غلط اقدار کیوں دکھاتی ہے؟

سب سے عام وجہ یہ ہے کہ آپ کا ڈیٹ ٹیبل صحیح طریقے سے ترتیب نہیں دیا گیا ہے۔ تین چیزوں کی تصدیق کریں: (1) ڈیٹ ٹیبل میں کوئی وقفہ نہیں ہے --- آپ کے ڈیٹا کے آغاز سے لے کر آج تک ہر تاریخ کو شامل کیا جانا چاہیے، (2) پاور 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])))۔ یہ موجودہ تاریخ کے فلٹر (ALL) کو ہٹاتا ہے اور اسے ایک ایسے فلٹر سے بدل دیتا ہے جس میں موجودہ سیاق و سباق میں شروع سے لے کر زیادہ سے زیادہ تاریخ تک تمام تاریخیں شامل ہوتی ہیں۔ ماہانہ میٹرکس میں، ہر قطار اس مہینے کے دوران مجموعی کل کو دکھاتی ہے۔

کیا میں ڈیٹا بیس میں ڈیٹا لکھنے کے لیے DAX استعمال کر سکتا ہوں؟

نمبر۔ DAX صرف پڑھنے کے لیے استفسار کی زبان ہے۔ یہ ڈسپلے کے لیے ڈیٹا کا حساب، فلٹر اور تبدیلی کر سکتا ہے، لیکن یہ سورس ڈیٹا بیس میں ڈیٹا کو داخل، اپ ڈیٹ یا حذف نہیں کر سکتا۔ رائٹ بیک منظرناموں کے لیے، Power BI میں ایمبیڈ کردہ Power Apps کا استعمال کریں، یا Power BI الرٹس کے ذریعے متحرک ہونے والے Power Automate فلوز کا استعمال کریں۔ کچھ تھرڈ پارٹی ٹولز (ایکٹریز، رائٹ بیک مینیجر) حسب ضرورت بصری کے ذریعے لکھنے کی صلاحیتوں کو شامل کرتے ہیں۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp