جستجو برای:
  • صفحه نخست
  • دوره های آموزشی
  • مطالب آموزشی
    • Power BI
    • Power Query
    • DAX
    • Microsoft Excel
    • SQL
    • SQL Server Analysis Services (SSAS)
    • SQL Server Integration Services (SSIS)
    • SQL Server Reporting Services (SSRS)
  • دانلودهاب
    • دانلود E-book های تحلیل داده و هوش تجاری
    • دانلود ویژوال های Power BI
    • دانلود فایل نقشه SVG
    • دانلود دیتاست
  • ارتباط با ما
 
تحلیل داده | هوش تجاری | آموزش Power BI
  • صفحه نخست
  • دوره های آموزشی
  • مطالب آموزشی
    • Power BI
    • Power Query
    • DAX
    • Microsoft Excel
    • SQL
    • SQL Server Analysis Services (SSAS)
    • SQL Server Integration Services (SSIS)
    • SQL Server Reporting Services (SSRS)
  • دانلودهاب
    • دانلود E-book های تحلیل داده و هوش تجاری
    • دانلود ویژوال های Power BI
    • دانلود فایل نقشه SVG
    • دانلود دیتاست
  • ارتباط با ما
0

ورود و ثبت نام

مطالب آموزشی

تحلیل داده | هوش تجاری | آموزش Power BIمطالب آموزشیDAXمفهوم Context Transition

مفهوم Context Transition

فروردین 18, 1404
ارسال شده توسط Banafsheh
DAX ، Power BI ، آموزش های متنی
44 بازدید

transition عملی است که توسط توابع CALCULATE و CALCULATETABLE در هنگام تعریف کانتکست فیلتر جدید انجام می‌شود؛ کانتکستی که عبارت داخل این توابع در آن ارزیابی می‌شود. تعریف رسمی context transition ساده به نظر می‌رسد، اما پیچیدگی‌هایی در پشت آن پنهان است. در توضیحات زیر، مثال‌هایی بر پایه تابع CALCULATE ارائه شده‌اند، اما تمام مفاهیم برای CALCULATETABLE نیز صدق می‌کنند.
تابع CALCULATE تمامی کانتکست‌های ردیفی (Row Context) موجود را به کانتکست فیلتر معادل تبدیل می‌کند، پیش از آن‌که آرگومان‌های فیلتر خودش را به کانتکست فیلتر اصلی اضافه کند. این تبدیل، در هنگام ایجاد کانتکست فیلتر جدید برای اجرای عبارت درون تابع رخ می‌دهد.
context transition با مثال‌ها بسیار بهتر قابل درک است تا از طریق تئوری. به عنوان مثال، فرض کنید یک مدل داده دارید که فقط شامل جدول‌های Product و Sales است، با یک رابطه بر اساس کلید ProductKey:

Picture1 2

شما می‌توانید یک ستون محاسبه‌شده (Calculated Column) در جدول Product ایجاد کنید:

Picture2 1

از آن‌جایی که این ستون محاسبه‌شده است، در یک row context محاسبه می‌شود. با این حال، چون تابع SUM مجموع قیمت‌های واحد (Unit Price) قابل مشاهده در filter context فعلی را محاسبه می‌کند، نتیجه برای هر محصول برابر است با مجموع قیمت‌های واحد از کل جدول.در یک ستون محاسبه‌شده، هیچ filter contextی وجود ندارد، تنها یک row context وجود دارد.

Picture3 1

بسیاری از مبتدیان DAX به اشتباه فکر می‌کنند که نتیجه‌ی این ستون محاسبه‌شده باید فقط مقدار Unit Price در سطر جاری باشد. اما به‌محض این‌که مفاهیم row context و filter context را به‌درستی یاد می‌گیرند، این رفتار برای‌شان کاملاً طبیعی می‌شود.

حالا اگر ستونی ایجاد کنید که شامل کدی با یک فراخوانی به CALCULATE باشد، چه اتفاقی می‌افتد؟

Picture4 1

این‌بار، CALCULATE دور تابع SUM قرار گرفته، بنابراین SUM در یک filter context متفاوت اجرا می‌شود.از آن‌جایی که CALCULATE هیچ پارامتر فیلتری ندارد، تنها اثر آن context transition است.

در این حالت، row context که فقط شامل یک سطر است، به یک filter context تبدیل می‌شود که همان سطر را شامل می‌شود.

در این مرحله، تابع SUM با یک filter context که تنها شامل یک سطر است مواجه می‌شود و در نتیجه، مقدار Unit Price فقط برای همان سطر را برمی‌گرداند:

Picture5 1

می‌توانی همین رفتار را هنگام استفاده از SUM با یک ستون از جدول Sales نیز مشاهده کنی، مانند دو ستون محاسبه‌شده‌ی زیر:

Picture6 1

اولین ستون محاسبه‌شده، مجموع کل Sales[Quantity] را برمی‌گرداند، چون هیچ filter context فعالی وجود ندارد.در حالی که ستونی که از CALCULATE استفاده می‌کند، مجموع Sales[Quantity] فقط برای محصول فعلی را برمی‌گرداند؛ زیرا filter context شامل محصول فعلی، به‌صورت خودکار به جدول Sales منتقل می‌شود، به‌دلیل وجود رابطه‌ای که بین این دو جدول برقرار است.

Picture7 1

تفاوت بزرگی بین filter contextای که توسط context transition ایجاد می‌شود و row context وجود دارد.

در واقع، filter contextی که توسط CALCULATE تولید می‌شود، بر روی تمام ستون‌های جدول فیلتر اعمال می‌کند تا یک سطر خاص را شناسایی کند؛ نه براساس شماره سطر.

بنابراین، اگر از context transition در جدولی استفاده کنی که سطرهای تکراری دارد، filter context تولیدشده توسط CALCULATE تمام آن سطرهای تکراری را در بر می‌گیرد. در نتیجه، فقط در صورتی می‌توان با اطمینان از context transition برای فیلتر کردن یک سطر خاص استفاده کرد که جدول فاقد سطرهای تکراری باشد. طبیعتاً این شرط در حالتی برقرار است که جدول دارای کلید اصلی (Primary Key) باشد که نبودِ تکرار را تضمین کند. همچنین مهم است که بدانی context transition قبل از اعمال فیلترهای اضافی داخل CALCULATE اتفاق می‌افتد.

بنابراین، فیلترهایی که در CALCULATE مشخص شده‌اند ممکن است فیلترهای حاصل از context transition را بازنویسی یا نادیده بگیرند. در مثال بعدی، جدول Product تنها شامل سه ستون است: ProductKey، Unit Price و Color. اگر ستونی محاسبه‌شده با کد زیر تعریف شود:

Picture8 1

تابع ALL هرگونه فیلتر روی ستون ProductKey را حذف می‌کند و چون این کار بعد از context transition انجام می‌شود، فیلتر اعمال‌شده بر ProductKey توسط context transition نیز حذف خواهد شد. در نتیجه، ستون محاسبه‌شده مجموع Unit Price را برای تمام محصولاتی که رنگ (Color) و قیمت واحد (Unit Price) یکسانی دارند محاسبه می‌کند.

Picture9 2

شایان ذکر است که هرگاه در یک عبارت DAX از یک Measure استفاده می‌کنی، این Measure به‌صورت خودکار توسط CALCULATE احاطه می‌شود. این CALCULATE خودکار که توسط DAX اضافه می‌شود، عملیات context transition را انجام می‌دهد و اگر به این نکته توجه نداشته باشی، ممکن است باعث بروز خطا در کد شود.

برای مثال، اگر بخواهی مدلی را کوئری بگیری که محصولاتی را برگرداند که بیش از ۱٪ از مجموع فروش را فروخته‌اند، ممکن است وسوسه شوی که کوئری را به شکل زیر بنویسی:

Picture10 1

به این نکته دقت کن که در خط ۸، یک CALCULATE تابع TotalSales را درون ADDCOLUMNS احاطه کرده است. این موضوع نشان می‌دهد که در آن نقطه context transition مورد نیاز است تا فقط فروش مربوط به محصولی که در حال پیمایش (iteration) است، محاسبه شود. اما در واقعیت، TotalSales یک Measure است، بنابراین نیازی به CALCULATE نیست، چون DAX به‌صورت خودکار آن را اضافه می‌کند.

بدتر این‌که، این کوئری درست کار نمی‌کند، چون موتور DAX به‌صورت خودکار یک CALCULATE را دور دومین فراخوانی TotalSales در شرط FILTER (خط ۱۰) هم اضافه می‌کند؛ جایی که داریم SalesOfProduct را با ۱٪ از TotalSales مقایسه می‌کنیم.

از آن‌جایی که CALCULATE در آن‌جا هم هست، کوئری در واقع فروش یک محصول را با ۱٪ از فروش همان محصول مقایسه می‌کند! در نتیجه، نتیجه نهایی اشتباه خواهد بود.

برای اینکه نتیجه‌ی درست را تولید کنی، می‌توانی کوئری را به شکل زیر بنویسی:

Picture11 1

همان‌طور که می‌بینی، CALCULATE غیرضروری (چون به‌صورت ضمنی اضافه می‌شود) را از دور اولین فراخوانی TotalSales (خط ۸) حذف کردیم. سپس، در شرط استفاده‌شده توسط FILTER (خط ۱۰)، از SUM(Sales[Quantity]) استفاده کردیم تا از context transition ضمنی جلوگیری کنیم.

کوئری قبلی می‌تواند به شکل زیباتری نوشته شود با استفاده از متغیرها:

Picture12 1

متغیرها در DAX به شما کمک می‌کنند تا یک عبارت را در contextی متفاوت از آن‌چه که می‌خواهید نتیجه‌اش را استفاده کنید، ارزیابی کنید. برای مشاهده مثال‌های بیشتر، می‌توانید به متغیرها در DAX مراجعه کنید.

اشتراک گذاری:
برچسب ها: آموزش Power BI
در تلگرام
کانال ما را دنبال کنید!
در اینستاگرام
ما را دنبال کنید!
در یوتوب
ما را دنبال کنید!
Created by potrace 1.14, written by Peter Selinger 2001-2017
در آپارات
ما را دنبال کنید!

مطالب زیر را حتما مطالعه کنید

Understanding Measures vs Calculated Columns in Power BI
تفاوت بین Measures و Calculated Columns در Power BI
Choosing between DISTINCT and VALUES in DAX
تفاوت توابع DISTINCT و VALUES برای مدل‌سازی داده‌ها در Power BI
Filtering weekdays in DAX
فیلتر کردن روزهای هفته در DAX | راهنمای پیشرفته محاسبات زمان هوشمند در Power BI
Understanding how DAX evaluates IF statements
نحوه اجرای تابع IF در DAX | آموزش بهینه‌سازی کدهای DAX در Power BI
4 Ways to SUM Null Values in Power Query M
۴ روش برای محاسبه مجموع مقادیر Null در Power Query M
Power BI Pro vs Premium Comparing Licenses
Power BI Pro در برابر Power BI Premium: کدام لایسنس برای شما مناسب است؟

دیدگاهتان را بنویسید لغو پاسخ

جستجو برای:
دسته‌ها
  • DAX
  • Microsoft Excel
  • Power BI
  • Power Query
  • SQL
  • SQL Server Analysis Services (SSAS)
  • SQL Server Integration Services (SSIS)
  • SQL Server Reporting Services (SSRS)
  • آموزش های متنی
  • آموزش های ویدئویی
  • تحلیل داده
  • هوش تجاری
نوشته‌های تازه
  • دستور SQL TRUNCATE TABLE – حذف سریع داده‌ها با حفظ ساختار جدول
  • دستور SQL SELECT INTO — ایجاد جدول جدید از داده‌های موجود
  • SELECT DISTINCT در SQL با مثال‌های کاربردی و توضیح ساده
  • آموزش SQL Alias — راهنمای کامل Table و Column Alias
  • آشنایی با انواع دستورات SQL: DML، DDL، DCL و TCL با مثال‌های عملی
درباره مجموعه تحلیل داده

باور داریم که تحلیل داده یک مهارت کلیدی برای موفقیت در دنیای امروز است و می‌خواهیم شما را در این مسیر راهنمایی کنیم. اگر آماده‌اید که با داده‌ها تصمیمات هوشمندانه‌تری بگیرید، از همین حالا یادگیری را شروع کنید.

  • تهران، جنت آباد جنوبی خیابان ایثارگران
  • 09102315004
  • info@tahliledadeh.com
آخرین مطالب
  • دستور SQL TRUNCATE TABLE – حذف سریع داده‌ها با حفظ ساختار جدول
  • دستور SQL SELECT INTO — ایجاد جدول جدید از داده‌های موجود
  • SELECT DISTINCT در SQL با مثال‌های کاربردی و توضیح ساده
برچسب‌ها
آموزش DAX آموزش Excel آموزش Power BI آموزش Power Query آموزش SQL آموزش SSAS آموزش SSIS آموزش SSRS تحلیل داده هوش تجاری
پرداخت ایمن
ایکون اینماد

ورود

رمز عبور را فراموش کرده اید؟

هنوز عضو نشده اید؟ عضویت در سایت