ডাটা অ্যানালাইসিস নিয়ে কাজ করছেন? তাহলে DAX (Data Analysis Expressions) ফাংশনগুলো আপনার জন্য খুবই গুরুত্বপূর্ণ। DAX হলো Power BI, Excel Power Pivot, এবং SSAS Tabular-এর জন্য একটি শক্তিশালী ফাংশনাল ভাষা। এর মাধ্যমে আপনি জটিল ক্যালকুলেশন এবং ডেটা ম্যানিপুলেশন করতে পারবেন। আজ আমরা DAX এর তিনটি গুরুত্বপূর্ণ ইটারেটর ফাংশন, যেমন – SUMX
, AVERAGEX
, এবং RANKX
নিয়ে বিস্তারিত আলোচনা করব। এগুলো কিভাবে আপনার ডেটা অ্যানালাইসিসকে আরও সহজ ও কার্যকর করতে পারে, তা জানুন।
DAX-এর এই ইটারেটর ফাংশনগুলো অনেকটা আপনার পরিচিত Excel-এর ফাংশনগুলোর মতোই, কিন্তু এদের কাজ করার পদ্ধতি একটু ভিন্ন। এদের "X" দিয়ে শুরু হওয়া নামগুলোই ইঙ্গিত দেয় যে, এরা টেবিলের প্রতিটি সারিতে (row) কাজ করে। ভাবুন তো, আপনার কাছে একটি বড় ডেটাসেট আছে যেখানে বাংলাদেশের বিভিন্ন জেলা থেকে কত টাকার পণ্য বিক্রি হয়েছে তার তথ্য আছে। আপনি যদি প্রতিটি জেলার বিক্রয় মূল্যের উপর ভিত্তি করে কিছু হিসাব করতে চান, তাহলে এই ফাংশনগুলো দারুণ কাজে আসবে।
DAX ইটারেটর ফাংশনগুলো কেন এত গুরুত্বপূর্ণ?
সাধারণ DAX ফাংশনগুলো (যেমন SUM
, AVERAGE
) একটি কলামের উপর কাজ করে। কিন্তু ইটারেটর ফাংশনগুলো একটি টেবিলের প্রতিটি সারিতে নির্দিষ্ট এক্সপ্রেশন মূল্যায়ন করে এবং তারপর সেই ফলাফলগুলোর উপর একটি অ্যাগ্রিগেশন (যোগফল, গড়, র্যাঙ্ক ইত্যাদি) করে। এর মানে হলো, আপনি আরও কাস্টমাইজড এবং সূক্ষ্ম ক্যালকুলেশন করতে পারবেন।
যেমন, ধরুন আপনার একটি দোকানে বিভিন্ন ধরণের পণ্যের বিক্রি হয়। আপনি যদি প্রতিটি পণ্যের একক মূল্য এবং বিক্রিত পরিমাণের গুণফল বের করে মোট বিক্রয় মূল্য জানতে চান, তাহলে SUMX
ব্যবহার করতে হবে। শুধু SUM
ফাংশন দিয়ে এটি করা সম্ভব নয়, কারণ SUM
শুধুমাত্র একটি কলামের যোগফল বের করে।
SUMX: প্রতিটি সারির জন্য যোগফল
SUMX
ফাংশনটি একটি টেবিলের প্রতিটি সারিতে একটি এক্সপ্রেশন মূল্যায়ন করে এবং সেই এক্সপ্রেশনগুলোর ফলাফলের যোগফল প্রদান করে। এর সিনট্যাক্সটি হলো: SUMX(<table>, <expression>)
এখানে, <table>
হলো যে টেবিলের উপর আপনি কাজ করতে চান, আর <expression>
হলো সেই গণনা যা প্রতিটি সারিতে প্রয়োগ করা হবে।
উদাহরণ:
ধরুন, আপনার একটি ডেটা টেবিল আছে বিক্রয়
নামে, যেখানে পণ্যের_নাম
, একক_মূল্য
, এবং বিক্রিত_পরিমাণ
কলামগুলো আছে। আপনি মোট বিক্রয় মূল্য বের করতে চান।
আপনি হয়তো ভাবছেন, "এটা তো খুব সহজ! একক_মূল্য
* বিক্রিত_পরিমাণ
করলেই তো হয়ে যায়।" কিন্তু DAX-এ সরাসরি এভাবে কলাম গুণ করা যায় না যদি না আপনি প্রতিটি সারির জন্য আলাদাভাবে হিসাব করতে চান। এখানেই SUMX
এর জাদু।
মোট_বিক্রয়_মূল্য = SUMX(
বিক্রয়,
বিক্রয়[একক_মূল্য] * বিক্রয়[বিক্রিত_পরিমাণ]
)
এই ক্যালকুলেশনটি বিক্রয়
টেবিলের প্রতিটি সারিতে যাবে। প্রতিটি সারিতে একক_মূল্য
এবং বিক্রিত_পরিমাণ
গুণ করবে এবং সবশেষে সেই গুণফলগুলোর মোট যোগফল বের করে দেবে। ভাবুন, আপনার এলাকার যেকোনো দোকানে প্রতিদিনের বিক্রি হিসাব করতে এটা কতটা কাজে লাগতে পারে!
AVERAGEX: প্রতিটি সারির গড়
AVERAGEX
ফাংশনটি SUMX
-এর মতোই কাজ করে, কিন্তু এটি এক্সপ্রেশনের ফলাফলের গড় বের করে। এর সিনট্যাক্সটি হলো: AVERAGEX(<table>, <expression>)
এখানেও, <table>
হলো টেবিল এবং <expression>
হলো প্রতিটি সারিতে প্রয়োগ করা গণনা।
উদাহরণ:
আবারও বিক্রয়
টেবিলের উদাহরণ দিচ্ছি। আপনি যদি প্রতিটি লেনদেনের গড় বিক্রয় মূল্য বের করতে চান, তাহলে AVERAGEX
ব্যবহার করতে পারেন।
গড়_লেনদেন_মূল্য = AVERAGEX(
বিক্রয়,
বিক্রয়[একক_মূল্য] * বিক্রয়[বিক্রিত_পরিমাণ]
)
এটি প্রতিটি লেনদেনের (প্রতিটি সারির) মোট মূল্য বের করবে এবং তারপর সেই মূল্যগুলোর গড় প্রদান করবে। ধরুন, আপনার অনলাইন দোকানের প্রতিটি অর্ডারের গড় মূল্য কত, সেটা জানতে চান। এই ফাংশনটি সেই কাজটি সহজেই করে দেবে।
RANKX: প্রতিটি সারির র্যাঙ্ক নির্ণয়
RANKX
ফাংশনটি একটি টেবিলের প্রতিটি সারিতে একটি এক্সপ্রেশনের উপর ভিত্তি করে র্যাঙ্ক (ক্রমিক স্থান) প্রদান করে। এর সিনট্যাক্সটি একটু বড় কিন্তু খুব কার্যকর:
RANKX(<table>, <expression>, [value], [order], [ties])
<table>
: যে টেবিলের উপর র্যাঙ্ক করা হবে।<expression>
: যে মানগুলোর উপর ভিত্তি করে র্যাঙ্ক করা হবে।[value]
: (ঐচ্ছিক) একটি নির্দিষ্ট মান যার র্যাঙ্ক বের করতে চান।[order]
: (ঐচ্ছিক)ASC
(ঊর্ধ্বক্রম) বাDESC
(অধঃক্রম) – ডিফল্টDESC
।[ties]
: (ঐচ্ছিক) যদি একাধিক সারি একই র্যাঙ্ক পায়, তাহলে কিভাবে তাদের সাথে আচরণ করা হবে –Skip
(র্যাঙ্ক স্কিপ করা) বাDense
(র্যাঙ্ক ঘন করা) – ডিফল্টSkip
।
উদাহরণ:
আপনার বিক্রয়
টেবিলের মোট_বিক্রয়_মূল্য
কলামের উপর ভিত্তি করে প্রতিটি পণ্যের র্যাঙ্ক বের করতে চান। অর্থাৎ, কোন পণ্যটি সবচেয়ে বেশি বিক্রি হয়েছে, তার র্যাঙ্ক ১ হবে।
পণ্য_বিক্রয়_র্যাঙ্ক = RANKX(
ALL(বিক্রয়[পণ্যের_নাম]),
CALCULATE(SUMX(বিক্রয়, বিক্রয়[একক_মূল্য] * বিক্রয়[বিক্রিত_পরিমাণ])),
,
DESC,
Dense
)
যদি ALL(বিক্রয়[পণ্যের_নাম])
ব্যবহার না করা হয়, তাহলে RANKX
শুধুমাত্র বর্তমান ফিল্টার কন্টেক্সটের মধ্যে র্যাঙ্ক করবে। ALL
ব্যবহার করে আমরা পুরো পণ্যের_নাম
কলামের উপর ভিত্তি করে র্যাঙ্ক করছি, যাতে প্রতিটি পণ্যের সঠিক র্যাঙ্ক পাওয়া যায়। ধরুন, আপনার পোশাকের দোকানে কোন শার্ট, প্যান্ট বা জুতো সবচেয়ে বেশি বিক্রি হচ্ছে, তা জানতে এই র্যাঙ্ক কাজে লাগবে।
কেন এই ফাংশনগুলো আপনার জানা উচিত?
এই ইটারেটর ফাংশনগুলো আপনাকে ডেটা অ্যানালাইসিসে অনেক নমনীয়তা দেয়। যখন আপনি ডেটার গভীরে গিয়ে নির্দিষ্ট প্যাটার্ন বা প্রবণতা খুঁজে বের করতে চান, তখন এগুলো অপরিহার্য হয়ে ওঠে। যেমন, বাংলাদেশের ডেটা সেন্টারগুলো তাদের সার্ভার পারফরম্যান্স বা নেটওয়ার্ক ট্রাফিকের গড় বা র্যাঙ্ক বের করতে এই ফাংশনগুলো ব্যবহার করতে পারে। ছোট ব্যবসার ক্ষেত্রেও, কোন পণ্যটি ভালো চলছে বা কোন মাসে বিক্রি বেশি হচ্ছে, তা জানতে এগুলো দারুণ কাজের।
প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)
Q1: DAX ইটারেটর ফাংশন এবং নন-ইটারেটর ফাংশনের মধ্যে মূল পার্থক্য কী?
A1: মূল পার্থক্য হলো কাজের পদ্ধতি। নন-ইটারেটর ফাংশন (যেমন SUM
, AVERAGE
) একটি কলামের উপর সরাসরি কাজ করে এবং একটি ফলাফল দেয়। অন্যদিকে, ইটারেটর ফাংশন (যেমন SUMX
, AVERAGEX
) টেবিলের প্রতিটি সারিতে একটি নির্দিষ্ট এক্সপ্রেশন মূল্যায়ন করে এবং তারপর সেই ফলাফলগুলোর উপর অ্যাগ্রিগেশন (যোগফল, গড়, র্যাঙ্ক) করে। এটি আপনাকে আরও কাস্টমাইজড এবং জটিল গণনার সুযোগ দেয়।
Q2: আমি কি একটি DAX ইটারেটর ফাংশনের মধ্যে অন্য একটি DAX ফাংশন ব্যবহার করতে পারি?
A2: হ্যাঁ, অবশ্যই! ইটারেটর ফাংশনগুলোর <expression>
অংশে আপনি প্রায় যেকোনো বৈধ DAX এক্সপ্রেশন ব্যবহার করতে পারেন, যার মধ্যে অন্যান্য DAX ফাংশন, যেমন CALCULATE
, RELATED
, বা এমনকি অন্য ইটারেটর ফাংশনও থাকতে পারে। এটি DAX-এর শক্তি এবং নমনীয়তা অনেক বাড়িয়ে দেয়।
Q3: RANKX
ফাংশনে ALL
বা ALLSELECTED
ব্যবহার করা কেন গুরুত্বপূর্ণ?
A3: RANKX
ফাংশনে ALL
বা ALLSELECTED
ব্যবহার করা খুবই গুরুত্বপূর্ণ কারণ এটি ফিল্টার কন্টেক্সট পরিবর্তন করে। যদি আপনি ALL
ব্যবহার না করেন, তাহলে RANKX
শুধুমাত্র বর্তমান ফিল্টার কন্টেক্সটের মধ্যে র্যাঙ্ক করবে, যা ভুল ফলাফল দিতে পারে। ALL
ব্যবহার করলে, ফাংশনটি পুরো টেবিল বা কলামের উপর ভিত্তি করে র্যাঙ্ক করে, ফিল্টার উপেক্ষা করে। ALLSELECTED
ব্যবহার করলে, শুধুমাত্র নির্বাচিত ডেটার উপর ভিত্তি করে র্যাঙ্ক হয়।
Q4: SUMX
এবং SUM
এর মধ্যে কোনটি বেশি কার্যকর?
A4: কার্যকারিতার দিক থেকে, এটি নির্ভর করে আপনার প্রয়োজনের উপর। যদি আপনার শুধু একটি কলামের যোগফল দরকার হয়, তাহলে SUM
বেশি কার্যকর কারণ এটি সরাসরি কলামের উপর কাজ করে এবং দ্রুত হয়। কিন্তু যদি আপনাকে প্রতিটি সারিতে একটি নির্দিষ্ট গণনা করে তারপর যোগফল বের করতে হয় (যেমন, পরিমাণ * মূল্য
), তাহলে SUMX
অপরিহার্য এবং এই ক্ষেত্রে এটিই একমাত্র কার্যকর উপায়।
Q5: DAX ইটারেটর ফাংশনগুলো কি Power BI ড্যাশবোর্ড তৈরিতে সাহায্য করে?
A5: হ্যাঁ, DAX ইটারেটর ফাংশনগুলো Power BI ড্যাশবোর্ড তৈরিতে অপরিহার্য। এই ফাংশনগুলো ব্যবহার করে আপনি কাস্টম মেজার তৈরি করতে পারেন যা আপনার ডেটা ভিজ্যুয়ালাইজেশনকে আরও শক্তিশালী এবং অর্থবহ করে তোলে। উদাহরণস্বরূপ, আপনি SUMX
ব্যবহার করে কাস্টম KPI (Key Performance Indicator) তৈরি করতে পারেন, AVERAGEX
ব্যবহার করে নির্দিষ্ট সময়ের গড় প্রবণতা দেখাতে পারেন, এবং RANKX
ব্যবহার করে শীর্ষ বিক্রেতা বা সেরা কর্মক্ষমতা সম্পন্ন বিভাগগুলো চিহ্নিত করতে পারেন। এসব মেজার আপনার ড্যাশবোর্ডে গভীর অন্তর্দৃষ্টি প্রদান করে।
গুরুত্বপূর্ণ বিষয় (Key Takeaways)
- ইটারেটর ফাংশন (X দিয়ে শেষ হওয়া): টেবিলের প্রতিটি সারিতে কাজ করে, যার ফলে আপনি আরও কাস্টমাইজড গণনা করতে পারেন।
- SUMX: প্রতিটি সারিতে একটি এক্সপ্রেশন মূল্যায়ন করে এবং তাদের যোগফল বের করে। মোট বিক্রয় মূল্য, মোট লাভ ইত্যাদি বের করার জন্য এটি অপরিহার্য।
- AVERAGEX: প্রতিটি সারিতে একটি এক্সপ্রেশন মূল্যায়ন করে এবং তাদের গড় বের করে। গড় লেনদেন মূল্য, গড় লাভজনকতা ইত্যাদি জানতে এটি ব্যবহার করা হয়।
- RANKX: একটি টেবিলের প্রতিটি সারিতে একটি এক্সপ্রেশনের উপর ভিত্তি করে র্যাঙ্ক প্রদান করে। শীর্ষ বিক্রেতা, সেরা পারফর্মার ইত্যাদি চিহ্নিত করার জন্য এটি খুবই কার্যকর।
- ফিল্টার কন্টেক্সট: ইটারেটর ফাংশনগুলো ফিল্টার কন্টেক্সটের উপর নির্ভরশীল। তাই,
ALL
বাALLSELECTED
এর মতো ফাংশন ব্যবহার করে ফিল্টার কন্টেক্সট সঠিকভাবে পরিচালনা করা জরুরি।
DAX ইটারেটর ফাংশনগুলো ডেটা অ্যানালাইসিসে আপনার ক্ষমতা অনেক বাড়িয়ে দেবে। এগুলো ব্যবহার করে আপনি আপনার ডেটা থেকে আরও গভীর অন্তর্দৃষ্টি বের করতে পারবেন, যা আপনার ব্যবসাকে আরও এগিয়ে নিয়ে যেতে সাহায্য করবে। আশা করি, এই আলোচনা আপনার জন্য সহায়ক হয়েছে। আপনার ডেটা অ্যানালাইসিসের যাত্রা শুভ হোক!