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 मार्च 202618 मिनट पढ़ें3.9k शब्द|

हमारी Data Analytics & BI श्रृंखला का हिस्सा

पूरी गाइड पढ़ें

DAX सूत्र प्रत्येक व्यवसाय उपयोगकर्ता को जानना चाहिए

DAX (डेटा एनालिसिस एक्सप्रेशंस) वह फॉर्मूला भाषा है जो पावर बीआई को एक साधारण चार्टिंग टूल से एक पूर्ण विश्लेषणात्मक इंजन में बदल देती है। जबकि पावर बीआई का ड्रैग-एंड-ड्रॉप इंटरफ़ेस बुनियादी एकत्रीकरण को संभालता है, वास्तविक व्यावसायिक बुद्धिमत्ता के लिए DAX की आवश्यकता होती है। साल-दर-साल तुलना, रोलिंग औसत, रैंकिंग, क्या होगा अगर परिदृश्य और जटिल KPI सभी DAX फ़ार्मुलों पर निर्भर करते हैं।

चुनौती यह है कि DAX भ्रामक रूप से सरल दिखता है लेकिन इस तरह से व्यवहार करता है कि अनुभवी एक्सेल उपयोगकर्ताओं को भी आश्चर्य होता है। फ़िल्टर संदर्भ, पंक्ति संदर्भ और संदर्भ संक्रमण की अवधारणाएँ DAX के लिए अद्वितीय हैं और एक्सेल या SQL में इसका कोई सीधा समकक्ष नहीं है। यह मार्गदर्शिका व्यावसायिक उपयोगकर्ताओं के लिए 20 सबसे व्यावहारिक DAX फ़ार्मुलों पर केंद्रित है, जिन्हें वास्तविक दुनिया के उदाहरणों के साथ आप तुरंत अपना सकते हैं।


मुख्य बातें

  • कैलकुलेट सबसे महत्वपूर्ण DAX फ़ंक्शन है --- यह फ़िल्टर संदर्भ को संशोधित करता है और 80 प्रतिशत से अधिक गैर-तुच्छ उपायों में उपयोग किया जाता है
  • टाइम इंटेलिजेंस फ़ंक्शंस (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) के लिए मॉडल में चिह्नित एक उचित दिनांक तालिका की आवश्यकता होती है
  • VAR/RETURN सिंटैक्स जटिल उपायों को पढ़ने योग्य बनाता है और अनावश्यक गणनाओं से बचाता है
  • इटरेटर फ़ंक्शंस (SUMX, AVERAGEX, RANKX) पंक्ति दर पंक्ति अभिव्यक्ति का मूल्यांकन करते हैं, जबकि एग्रीगेटर (SUM, AVERAGE) कॉलम पर काम करते हैं
  • संदर्भ संक्रमण तब होता है जब एक परिकलित स्तंभ या पुनरावर्तक एक माप को कॉल करता है, पंक्ति संदर्भ को फ़िल्टर संदर्भ में परिवर्तित करता है
  • SWITCH(TRUE(), ...) नेस्टेड IF कथनों को प्रतिस्थापित करता है और कहीं अधिक पठनीय है
  • ALL, ALLEXCEPT, और REMOVEFILTERS नियंत्रित करते हैं कि कौन से फ़िल्टर सक्रिय हैं --- लेकिन RLS निहितार्थों से सावधान रहें

फाउंडेशन: फ़िल्टर संदर्भ और पंक्ति संदर्भ

सूत्रों में गोता लगाने से पहले, इन दो अवधारणाओं को समझना आवश्यक है। DAX में प्रत्येक भ्रम फ़िल्टर संदर्भ और पंक्ति संदर्भ पर आधारित होता है।

फ़िल्टर प्रसंग

फ़िल्टर संदर्भ किसी गणना पर लागू फ़िल्टर का सेट है। यह स्लाइसर, विज़ुअल फ़िल्टर, पेज फ़िल्टर, रिपोर्ट फ़िल्टर और आरएलएस से आता है। जब आप मैट्रिक्स दृश्य में पंक्तियों पर "वर्ष" और स्तंभों पर "क्षेत्र" के साथ एक माप रखते हैं, तो प्रत्येक सेल में एक अद्वितीय फ़िल्टर संदर्भ होता है: (वर्ष = 2025, क्षेत्र = उत्तरी अमेरिका), (वर्ष = 2025, क्षेत्र = ईएमईए), और इसी तरह।

प्रत्येक 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
    )
)

महत्वपूर्ण: फ़िल्टर पंक्ति दर पंक्ति पुनरावृत्त करता है, जिससे यह बड़ी तालिकाओं पर सरल 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")

पूर्वावश्यकता: दिनांक तालिका को मॉडल में दिनांक तालिका के रूप में चिह्नित किया जाना चाहिए (तालिका उपकरण, फिर दिनांक तालिका के रूप में चिह्नित करें)।

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(table, expression, [value], [order], [ties])

उदाहरण: राजस्व के आधार पर उत्पादों को रैंक करें

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

ALL(Products[ProductName]) उत्पादों पर स्लाइसर फ़िल्टर की परवाह किए बिना, रैंक करने के लिए उत्पादों की पूरी सूची प्रदान करता है। DESC का मतलब है कि उच्चतम राजस्व को रैंक 1 मिलती है। DENSE का मतलब है कि बंधे हुए मूल्यों को समान रैंक मिलती है।

उदाहरण: शीर्ष एन फ़िल्टर

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 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. विभाजन - सुरक्षित विभाजन

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(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 दो स्तंभों को गुणा नहीं कर सकता. आपको प्रत्येक पंक्ति के लिए मात्रा गुणा UnitPrice का मूल्यांकन करने और फिर परिणामों का योग करने के लिए SUMX की आवश्यकता है।

15. औसतएक्स - पंक्ति-दर-पंक्ति औसत

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 एक या अधिक खोज मानदंडों के आधार पर तालिका से एक मान पुनर्प्राप्त करता है। यह Excel के VLOOKUP का DAX समतुल्य है।

सिंटैक्स: LOOKUPVALUE(result_column, search_column, search_value, ...)

उदाहरण:

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

ध्यान दें: LOOKUPVALUE का उपयोग आमतौर पर गणना किए गए कॉलम में किया जाता है, मापों में नहीं। माप में, संबंधित (कई-से-एक के लिए) या संबंधित (एक-से-कई के लिए) को प्राथमिकता दी जाती है।

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 की आवश्यकता होने का सबसे आम कारण समय की समझ है। पावर बीआई के समय खुफिया कार्यों के लिए एक समर्पित दिनांक तालिका की आवश्यकता होती है। यहां समय माप का एक व्यापक सेट दिया गया है।

पूर्वावश्यकताएँ: दिनांक तालिका

आपके मॉडल में एक दिनांक तालिका होनी चाहिए:

  • आपके संपूर्ण डेटा रेंज को कवर करने वाला एक सतत दिनांक कॉलम (कोई अंतराल नहीं)।
  • तालिका को दिनांक तालिका के रूप में चिह्नित किया गया है (तालिका उपकरण, फिर दिनांक तालिका के रूप में चिह्नित करें)
  • दिनांक तालिका के दिनांक स्तंभ से प्रत्येक तथ्य तालिका के दिनांक स्तंभ से एक संबंध

सामान्य समय खुफिया उपाय

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

वित्तीय वर्ष समय आसूचना

यदि आपका वित्तीय वर्ष कैलेंडर वर्ष के साथ संरेखित नहीं है, तो वैकल्पिक वर्ष_अंत_दिनांक पैरामीटर का उपयोग करें:

-- 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: एबीसी विश्लेषण (पेरेटो वर्गीकरण)

उत्पादों को ए (राजस्व का शीर्ष 80%), बी (अगला 15%), और सी (निचला 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: गतिशील वार्षिक कुल (एमएटी)

एक गतिशील वार्षिक कुल पिछले 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(Table) या ALL(Table[Col1], Table[Col2])

प्रदर्शन विश्लेषक

पावर बीआई डेस्कटॉप का प्रदर्शन विश्लेषक (देखें, फिर प्रदर्शन विश्लेषक) प्रत्येक दृश्य के लिए DAX क्वेरी और निष्पादन समय दिखाता है। इसका उपयोग करें:

  1. धीमे दृश्यों को पहचानें (1 सेकंड से अधिक)
  2. विस्तृत विश्लेषण के लिए DAX क्वेरी को DAX स्टूडियो में कॉपी करें
  3. उपायों को अनुकूलित करते समय निष्पादन के पहले/बाद के समय की तुलना करें

डैक्स स्टूडियो

DAX स्टूडियो एक निःशुल्क बाहरी उपकरण है जो विस्तृत क्वेरी विश्लेषण प्रदान करता है। यह दिखाता है:

  • स्टोरेज इंजन क्वेरीज़ (तेज़, कॉलम-स्टोर स्कैन)
  • फॉर्मूला इंजन क्वेरीज़ (धीमी, पंक्ति-दर-पंक्ति मूल्यांकन)
  • भौतिकीकरण आकार (इंजन के बीच फेरबदल किया गया डेटा)

यदि कोई माप कई सूत्र इंजन क्वेरी उत्पन्न करता है, तो यह संभवतः बहुत अधिक पुनरावृत्तियों या जटिल फ़िल्टर अभिव्यक्तियों का उपयोग करता है। स्टोरेज इंजन पर अधिक काम करने के लिए रिफैक्टर।

पावर बीआई प्रशिक्षण के लिए जो उन्नत अनुकूलन के माध्यम से बुनियादी बातों से DAX को कवर करता है, ECOSIRE आपके विशिष्ट डेटासेट और व्यावसायिक प्रश्नों के अनुरूप व्यावहारिक कार्यशालाएँ प्रदान करता है।


अक्सर पूछे जाने वाले प्रश्न

माप और परिकलित कॉलम के बीच क्या अंतर है?

वर्तमान फ़िल्टर संदर्भ में क्वेरी समय पर एक माप का मूल्यांकन किया जाता है। यह तालिका में डेटा नहीं जोड़ता --- यह गतिशील रूप से एक मान की गणना करता है। डेटा रीफ्रेश समय पर एक परिकलित कॉलम का मूल्यांकन किया जाता है और तालिका में एक भौतिक कॉलम जोड़ा जाता है। एकत्रीकरण और KPI के लिए उपायों का उपयोग करें जो स्लाइसर और फ़िल्टर के आधार पर बदलते हैं। पंक्ति-स्तरीय वर्गीकरणों या मानों के लिए परिकलित स्तंभों का उपयोग करें जिन्हें स्लाइसर, फ़िल्टर या संबंधों में उपयोग करने की आवश्यकता है। उपायों को लगभग हमेशा प्राथमिकता दी जाती है क्योंकि वे मॉडल के आकार में वृद्धि नहीं करते हैं।

मेरा YTD माप गलत मान क्यों दिखाता है?

सबसे आम कारण यह है कि आपकी दिनांक तालिका ठीक से कॉन्फ़िगर नहीं की गई है। तीन चीजें सत्यापित करें: (1) दिनांक तालिका में कोई अंतराल नहीं है --- आपके डेटा की शुरुआत से लेकर वर्तमान तक की प्रत्येक तिथि को शामिल किया जाना चाहिए, (2) तालिका को पावर बीआई (टेबल टूल्स, फिर दिनांक तालिका के रूप में चिह्नित करें) में दिनांक तालिका के रूप में चिह्नित किया गया है, और (3) दिनांक तालिका और आपकी तथ्य तालिका के बीच संबंध सक्रिय है और सही ढंग से मैप किया गया है। यह भी जांचें कि आपके दिनांक कॉलम में कोई समय घटक शामिल नहीं है जो सटीक मिलान को रोकता है।

मुझे कैलकुलेट बनाम फ़िल्टर का उपयोग कब करना चाहिए?

जब आप फ़िल्टर को एक साधारण कॉलम तुलना (उदाहरण के लिए, Products[Category] = "Electronics") के रूप में व्यक्त कर सकते हैं तो CALCULATE का उपयोग करें। 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-संचालित व्यावसायिक समाधानों पर अंतर्दृष्टि साझा कर रहे हैं।

WhatsApp पर चैट करें