DAX भाषा सीखने की पाठ्यपुस्तक
Mastering DAX: From Zero to Hero डेटा एनालिसिस एक्सप्रेशंस पर आपका विज़ुअल गाइड DAX क्या है?
DAX (Data Analysis Expressions) एक फ़ंक्शन फॉर्मूला भाषा है जिसका उपयोग Power BI, Analysis Services और Excel में Power Pivot जैसे एनालिटिकल टूल में कस्टम गणनाएँ बनाने के लिए किया जाता है। यह प्रोग्रामिंग भाषा नहीं है, बल्कि फंक्शन्स, ऑपरेटर्स और कॉन्स्टेंट्स का एक संग्रह है जिनका उपयोग किसी सूत्र में एक या अधिक मानों की गणना करने और वापस करने के लिए किया जा सकता है। इसका मुख्य उद्देश्य डेटा मॉडल पर काम करना है, न कि Excel की तरह व्यक्तिगत सेल पर। गणना किए गए कॉलम (Calculated Columns) एक बार, डेटा रिफ्रेश के दौरान गणना किया जाता है और मॉडल में भौतिक रूप से संग्रहीत होता है। ये रो कॉन्टेक्स्ट (Row Context) में काम करते हैं - सूत्र केवल वर्तमान पंक्ति से मान देखता है। → इसका उपयोग करें जब: परिणाम को फ़िल्टर या चार्ट के अक्ष में उपयोग करना हो। गणना स्थिर हो और पंक्ति पर निर्भर करती हो। आप डेटा तालिका में परिणाम देखना चाहते हों। माप (Measures) विज़ुअलाइज़ेशन में उपयोग के समय गतिशील रूप से गणना की जाती है। इन्हें मॉडल में संग्रहीत नहीं किया जाता है। ये फ़िल्टर कॉन्टेक्स्ट (Filter Context) में काम करते हैं - सूत्र चार्ट, स्लाइसर आदि से फ़िल्टर पर प्रतिक्रिया करता है। Σ इसका उपयोग करें जब: आपको गतिशील एग्रीगेशन की आवश्यकता हो (जैसे बिक्री का योग)। परिणाम चार्ट पर एक मान होना चाहिए। गणना को उपयोगकर्ता इंटरैक्शन पर प्रतिक्रिया देनी चाहिए। अवधारणा 1: गणना का संदर्भ (Context of Calculations) संदर्भ को समझना DAX की कुंजी है। प्रत्येक गणना एक विशिष्ट संदर्भ में होती है जो परिभाषित करता है कि फॉर्मूला के लिए कौन सा डेटा "दृश्यमान" है। पंक्ति संदर्भ (Row Context) "मैं इस एक पंक्ति को देखता हूँ"। यह गणना किए गए कॉलम और इटरेटिंग फ़ंक्शंस (जैसे SUMX) में पाया जाता है। फॉर्मूला को केवल वर्तमान पंक्ति के लिए कॉलम मानों तक पहुंच प्राप्त होती है। फ़िल्टर संदर्भ (Filter Context) "मैं फ़िल्टर किया गया डेटा सेट देखता हूँ"। विज़ुअलाइज़ेशन में सक्रिय फ़िल्टर का सेट (एक्सिस, लेजेंड, स्लाइसर से)। माप इस संदर्भ में काम करते हैं। बुनियादी फ़ंक्शन: इटरेटर्स बनाम एग्रीगेट्स (Iterators vs Aggregations) एग्रीगेटिंग फ़ंक्शंस (जैसे `SUM`) सक्रिय फ़िल्टर संदर्भ में पूरे कॉलम पर काम करते हैं। इटरेटिंग फ़ंक्शंस (अंत में "X" के साथ, जैसे `SUMX`) पंक्ति दर पंक्ति जाते हैं (पंक्ति संदर्भ बनाते हुए) और गणना करते हैं, अंत में परिणामों को एग्रीगेट करते हैं। यह कई कॉलम पर आधारित गणनाओं के लिए महत्वपूर्ण है, उदाहरण के लिए: मात्रा * कीमत। उदाहरण: कुल बिक्री (Total Sales) Total Sales (SUMX) = SUMX( 'Sales', 'Sales'[Quantity] * 'Sales'[Net Price] ) ऊपर दिया गया `SUMX` फ़ॉर्मूला 'Sales' तालिका की प्रत्येक पंक्ति से गुजरता है, उस पंक्ति में मात्रा को कीमत से गुणा करता है, और फिर सभी परिणामों का योग करके सही कुल बिक्री देता है। फ़ंक्शन `CALCULATE()`: संदर्भ संशोधन इंजन `CALCULATE` DAX में सबसे महत्वपूर्ण फ़ंक्शन है। यह उस फ़िल्टर संदर्भ को संशोधित करने की अनुमति देता है जिसमें माप (measure) की गणना की जाती है। यह विश्लेषणात्मक प्रश्न पूछने का एक उपकरण है, जैसे कि "उत्पाद X के लिए बिक्री क्या थी?" या "सभी फ़िल्टरों को अनदेखा करते हुए बिक्री क्या थी?"। अभिव्यक्ति [Total Sales] + फ़िल्टर संशोधक 1 'Product'[Category] = "Laptops" + फ़िल्टर संशोधक 2 ALL('Date') = नया परिणाम सभी तारीखों से लैपटॉप की बिक्री Sales Laptops = CALCULATE( [Total Sales], 'Product'[Category] = "Laptops" ) संदर्भ संशोधन: `ALL()` `ALL()`, `ALLEXCEPT()`, या `REMOVEFILTERS()` जैसे फ़ंक्शन संदर्भ से फ़िल्टर हटाने के लिए उपयोग किए जाते हैं। `ALL()` दी गई तालिका या कॉलम से सभी फ़िल्टर हटा देता है। यह कुल में प्रतिशत हिस्सेदारी की गणना करने के लिए आवश्यक है, उदाहरण के लिए, "कुल बिक्री के संबंध में श्रेणी की बिक्री का %"। उदाहरण: बिक्री में % हिस्सा % of Total Sales = DIVIDE( [Total Sales], CALCULATE( [Total Sales], ALL('Product') ) ) `ALL('Product')` के साथ `CALCULATE` के हर में यह कुल बिक्री की गणना करता है, जो उत्पाद तालिका पर लागू किसी भी फ़िल्टर को अनदेखा करता है। इसकी बदौलत हम किसी दी गई श्रेणी की बिक्री (अंश) की तुलना सभी श्रेणियों की बिक्री के योग (हर) से कर सकते हैं। समय बुद्धिमत्ता: समय विश्लेषण DAX में समय के साथ डेटा का विश्लेषण करने के लिए Time Intelligence फ़ंक्शंस का एक शक्तिशाली सेट है। इसके लिए मॉडल में एक सही कैलेंडर टेबल होना आवश्यक है। ये पिछले वर्ष की समान अवधि (Year-over-Year) या रनिंग टोटल (Running Total) जैसी माप की गणना करना आसान बनाते हैं। उदाहरण: साल-दर-साल बिक्री (YoY) Sales Last Year = CALCULATE( [Total Sales], SAMEPERIODLASTYEAR('Date'[Date]) ) `SAMEPERIODLASTYEAR` फ़ंक्शन तारीख के संदर्भ को एक साल पीछे ले जाता है। `CALCULATE` के अंदर उपयोग किया जाने पर यह पिछले वर्ष की ठीक उसी अवधि के लिए `[Total Sales]` माप की गणना करने की अनुमति देता है, जिससे वृद्धि की तुलना करना संभव हो जाता है। मीट्रिक 1: मार्जिन % यह लाभ का राजस्व के प्रतिशत अनुपात की गणना करता है। Margin % = DIVIDE( [Total Profit], [Total Sales] ) मीट्रिक 2: YoY वृद्धि % यह पिछले वर्ष की तुलना में बिक्री की प्रतिशत वृद्धि की गणना करता है। Sales YoY Growth % = DIVIDE( [Total Sales] - [Sales Last Year], [Sales Last Year] ) +15.2% वर्ष-दर-वर्ष बिक्री वृद्धि माप 3: संचयी योग (YTD) यह वर्ष की शुरुआत से वर्तमान तिथि तक कुल बिक्री की गणना करता है। Sales YTD = TOTALYTD( [Total Sales], 'Date'[Date] ) €1.25M वर्ष की शुरुआत से बिक्री DAX फ़ार्मुलों का विस्तृत शब्दकोश एग्रीगेटिंग और इटरेटिंग फ़ंक्शन SUM / AVERAGE / MIN / MAX बुनियादी संचयन: कॉलम में योग करता है, औसत की गणना करता है, या न्यूनतम या अधिकतम ढूंढता है। Total Sales = SUM('Sales'[Amount]) COUNTROWS तालिका में पंक्तियों की संख्या गिनता है। Number of Transactions = COUNTROWS('Sales') DISTINCTCOUNT कॉलम में अद्वितीय मानों की गणना करता है। Unique Customers = DISTINCTCOUNT('Sales'[CustomerID]) SUMX / AVERAGEX / MINX / MAXX इटरेटिंग संस्करण: प्रत्येक पंक्ति के लिए अभिव्यक्ति की गणना करते हैं, और फिर परिणामों का समूहन (aggregate) करते हैं। Total Revenue = SUMX('Sales', 'Sales'[Quantity] * 'Sales'[Price]) फ़िल्टरिंग और संदर्भ कार्य (Filtering and Context Functions) FILTER यह एक ऐसी तालिका लौटाता है जो किसी अन्य तालिका का उपसमूह होती है, जो एक शर्त पर आधारित होती है। High Value Sales = CALCULATE([Total Sales], FILTER('Sales', 'Sales'[Amount] > 1000)) ALL / ALLEXCEPT / ALLSELECTED यह फ़िल्टरों को हटाकर (ALL), अपवादों के साथ हटाने (ALLEXCEPT), या केवल विज़ुअलाइज़ेशन से फ़िल्टर को शामिल करके फ़िल्टर संदर्भ को संशोधित करता है। % of Category = DIVIDE([Total Sales], CALCULATE([Total Sales], ALLEXCEPT('Product', 'Product'[Category]))) KEEPFILTERS यह मौजूदा संदर्भ को ओवरराइट करने के बजाय उसे बनाए रखते हुए एक नया फ़िल्टर लागू करता है। Blue Laptops Sales = CALCULATE([Total Sales], KEEPFILTERS('Product'[Color] = "Blue")) VALUES / DISTINCT ये अद्वितीय मानों की एक एकल-स्तंभ वाली तालिका लौटाते हैं। Products With Sales = COUNTROWS(VALUES('Sales'[ProductID])) समय फ़ंक्शन (टाइम इंटेलिजेंस) DATEADD / PARALLELPERIOD / SAMEPERIODLASTYEAR तुलना के लिए समय में अवधियों को स्थानांतरित करने के फ़ंक्शन। Sales Previous Month = CALCULATE([Total Sales], DATEADD('Date'[Date], -1, MONTH)) DATESYTD / DATESQTD / DATESMTD ये संदर्भ में वर्ष/तिमाही/महीने की शुरुआत से अंतिम तिथि तक की तारीखों की एक तालिका लौटाते हैं। Sales Year-To-Date = CALCULATE([Total Sales], DATESYTD('Date'[Date])) STARTOF...
/ ENDOF...
(MONTH, QUARTER, YEAR) ये अवधि की पहली या अंतिम तिथि लौटाते हैं। Sales on Last Day of Month = CALCULATE([Total Sales], ENDOFMONTH('Date'[Date])) तार्किक और सशर्त फ़ंक्शन IF / SWITCH ये सशर्त तर्क लागू करते हैं। सरल शर्तों के लिए IF, और कई संभावित परिणामों के लिए SWITCH का उपयोग होता है। Price Segment = SWITCH(TRUE(), 'Product'[Price] AND (&&) / OR (||) / NOT कई शर्तों को जोड़ने के लिए तार्किक ऑपरेटर। High Value Electronics = CALCULATE([Total Sales], 'Product'[Category] = "Electronics" && 'Sales'[Amount] > 1000) ISBLANK / ISERROR ये जाँचते हैं कि अभिव्यक्ति खाली है या त्रुटि लौटाती है। यह DIVIDE में उपयोगी है। Safe Division = IF(NOT(ISBLANK([Denominator])), DIVIDE([Numerator], [Denominator]), 0) टेक्स्ट फ़ंक्शन CONCATENATE (&) / COMBINEVALUES टेक्स्ट स्ट्रिंग्स को जोड़ते हैं। Customer Full Name = 'Customer'[FirstName] & " " & 'Customer'[LastName] FORMAT किसी निर्दिष्ट प्रारूप में मान को टेक्स्ट में परिवर्तित करता है। Formatted Sales = "Sales: " & FORMAT([Total Sales], "Currency") LEFT / RIGHT / MID टेक्स्ट स्ट्रिंग का एक हिस्सा निकालता है। Product Code Prefix = LEFT('Product'[ProductCode], 2) उन्नत सारणीबद्ध कार्यक्षमताएं SUMMARIZE / ADDCOLUMNS ये वर्चुअल टेबल बनाते हैं। SUMMARIZE डेटा को समूहित करता है, और ADDCOLUMNS तालिका में नए गणना कॉलम जोड़ता है। Sales By Category = SUMMARIZE('Product', 'Product'[Category], "Total Sales", [Total Sales]) RANKX यह एक निर्दिष्ट अभिव्यक्ति में वर्तमान संदर्भ के लिए रैंकिंग स्थिति लौटाता है। Product Rank by Sales = RANKX(ALL('Product'), [Total Sales]) GENERATE / CROSSJOIN वे दो तालिकाओं से कार्तीय गुणनफल (पंक्तियों के सभी संभावित संयोजन) बनाते हैं। All Product-Customer Pairs = CROSSJOIN(VALUES('Product'[Product]), VALUES('Customer'[Customer]))