Контекст във формули на DAX

Отнася се за
Excel за Microsoft 365 Excel 2024 Excel 2021 Excel 2019 Excel 2016

Контекстът ви позволява да извършвате динамичен анализ, при който резултатите от формула могат да се променят, за да отразят текущия ред или селекция на клетка, както и всички свързани данни. Разбирането на контекста и ефективното използване на контекста са много важни за създаването на високоефективни формули, динамични анализи и за отстраняване на проблеми във формулите.

Този раздел дефинира различните типове контекст: контекст на реда, контекст на заявката и контекст на филтъра. Тя обяснява как се оценява контекстът за формулите в изчисляемите колони и в обобщените таблици.

Последната част на тази статия предоставя връзки към подробни примери, които илюстрират как резултатите от формулите се променят в зависимост от контекста.

Разбиране на контекста

Формулите в Power Pivot могат да бъдат засегнати от филтрите, приложени в обобщената таблица, от релациите между таблиците и от филтрите, използвани във формулите. Контекстът е това, което прави възможно извършването на динамичен анализ. Разбирането на контекста е важно за създаването и отстраняването на неизправности във формули.

Има различни типове контекст: контекст на реда, контекст на заявката и контекст на филтъра.

Контекстът на реда може да се опише като "текущия ред". Ако сте създали изчисляема колона, контекстът на реда се състои от стойностите във всеки отделен ред и стойностите в колоните, които са свързани с текущия ред. Има също някои функции (EARLIER и EARLYST), които получават стойност от текущия ред и след това използват тази стойност, докато извършват операция над цялата таблица.

Контекстът на заявката се отнася към подмножеството от данни, което се създава неявно за всяка клетка в обобщената таблица в зависимост от заглавките на редовете и колоните.

Контекстът на филтъра е набор от стойности, разрешени във всяка колона въз основа на ограничения на филтъра, приложени към реда или дефинирани от изрази за филтриране във формулата.

Най-горе на страницата

Контекст на реда

Ако създавате формула в изчисляема колона, контекстът на реда за тази формула включва стойностите от всички колони в текущия ред. Ако таблицата е свързана с друга таблица, съдържанието включва също всички стойности от тази друга таблица, които са свързани с текущия ред.

Да предположим например, че сте създали изчисляема колона =[Навло] + [Данък], която събира две колони от една и съща таблица. Тази формула се държи като формули в таблица на Excel, които автоматично препращат към стойности от същия ред. Обърнете внимание, че таблиците се различават от диапазоните: не можете да препращате към стойност от реда преди текущия ред с помощта на записване на диапазони и не можете да препращате към произволна единична стойност в таблица или клетка. Винаги трябва да работите с таблици и колони.

Контекстът на реда автоматично следва релациите между таблиците, за да се определи кои редове в свързаните таблици са свързани с текущия ред.

Например следващата формула използва функцията RELATED, за да извлече данъчна стойност от свързана таблица въз основа на региона, в който е изпратена поръчката. Данъчната стойност се определя, като се използва стойността за регион в текущата таблица, търсите региона в свързаната таблица и след това получавате данъчната ставка за този регион от свързаната таблица.

= [Навло] + RELATED('Регион'[ДанъчнаСтавка])

Тази формула просто получава данъчната ставка за текущия регион от таблицата "Регион". Не е нужно да знаете или да задавате ключа, който свързва таблиците.

Контекст с много редове

Освен това DAX съдържа функции, които извършват итерации на изчисленията в таблица. Тези функции може да имат няколко текущи реда и контекста на текущия ред. От гледна точка на програмирането, можете да създавате формули, които се повтарят във вътрешен и външен цикъл.

Да предположим например, че вашата работна книга съдържа таблица "Продукти " и таблица "Продажби ". Можете да искате да прегледате цялата таблица с продажби, която е пълна с транзакции, включващи множество продукти, и да намерите най-голямото заявено количество за всеки продукт във всяка една транзакция.

В Excel това изчисление изисква серия от междинни обобщения, които ще трябва да се създадат отново, ако данните се променят. Ако сте опитен потребител на Excel, е възможно да можете да създадете формули за масиви, които да свършат работа. Като алтернатива в релационна база данни можете да напишете вложени подселекции.

С DAX обаче можете да създадете една формула, която връща правилната стойност, и резултатите се актуализират автоматично всеки път, когато добавяте данни към таблиците.

=MAXX(FILTER(Продажби,[ProdKey]=EARLIER([ProdKey])),Sales[OrderQty])

За подробно запознаване с тази формула вж. функцията EARLY.

Накратко, функцията EARLIER съхранява контекста на реда от операцията, която предхожда текущата операция. Във всеки един момент функцията съхранява два набора от контекст в паметта: един набор от контекст представя текущия ред за вътрешния цикъл на формулата, а друг набор от контекст представя текущия ред за външния цикъл на формулата. DAX автоматично подава стойности между двата цикъла, така че да можете да създавате сложни сборове.

Най-горе на страницата

Контекст на заявката

Контекстът на заявката препраща към подмножеството от данни, което неявно се извлича за формула. Когато пуснете мярка или друго поле за стойност в клетка на обобщена таблица, системата на Power Pivot преглежда заглавките на редовете и колоните, сегментаторите и филтрите за отчети, за да определи контекста. След това Power Pivot прави необходимите изчисления, за да попълни всяка клетка в обобщената таблица. Наборът от данни, които се извличат, е контекстът на заявката за всяка клетка.

Тъй като контекстът може да се променя в зависимост от това къде поставяте формулата, резултатите от формулата се променят и в зависимост от това дали използвате формулата в обобщена таблица с много групирания и филтри, или в изчисляема колона без филтри и минимален контекст.

Да предположим например, че създавате тази проста формула, която сумира стойностите в колоната " Печалба " на таблицата "Продажби" :

=SUM('Продажби'[Печалба])

Ако използвате тази формула в изчисляема колона в таблицата "Продажби", резултатите за формулата ще бъдат едни и същи за цялата таблица, защото контекстът на заявката за формулата е винаги целият набор от данни на таблицата "Продажби". Вашите резултати ще имат печалба за всички региони, всички продукти, всички години и т.н.

Обикновено обаче не искате да виждате един и същ резултат стотици пъти, а вместо това искате да получите печалбата за определена година, конкретна страна или регион, конкретен продукт или комбинация от тях, а след това да получите общата сума.

В обобщената таблица е лесно да промените контекста, като добавите или премахнете заглавки на колони и редове и като добавите или премахнете сегментатори. Можете да създадете формула като тази по-горе, в мярка, а след това да я пуснете в обобщена таблица. Винаги когато добавяте заглавия на колони или редове към обобщената таблица, променяте контекста на заявката, в който се изчислява мярката. Операциите за нарязване и филтриране също оказват влияние върху контекста. Следователно, една и съща формула, използвана в обобщена таблица, се изчислява в различен контекст на заявка за всяка клетка.

Най-горе на страницата

Контекст на филтъра

Контекст на филтъра се добавя, когато зададете ограничения на филтъра върху набор от стойности, разрешени в колона или таблица, като използвате аргументи във формула. Контекстът на филтъра се прилага върху други контексти, например контекст на ред или контекст на заявка.

Например една обобщена таблица изчислява стойностите си за всяка клетка въз основа на заглавията на редовете и колоните, както е описано в предишния раздел за контекста на заявката. Обаче в мерките или изчисляемите колони, които добавяте към обобщената таблица, можете да зададете изрази за филтриране, за да управлявате стойностите, използвани от формулата. Можете също избирателно да изчистите филтрите за определени колони.

За повече информация относно създаването на филтри във формули вж. "Функции за филтриране".

За пример как могат да бъдат изчистени филтрите, за да се създадат общи суми, вижте функцията ALL.

За примери как избирателно да изчиствате и прилагате филтри във формули, вж. функцията ALLEXCEPT

Затова трябва да прегледате дефиницията за мерки или формули, използвани в обобщената таблица, за да сте наясно с контекста на филтъра, когато интерпретирате резултатите от формулите.

Най-горе на страницата

Определяне на контекст във формули

Когато създавате формула, Power Pivot за Excel първо проверява за общ синтаксис и след това проверява имената на колоните и таблиците, които предоставяте, спрямо възможните колони и таблици в настоящия контекст. Ако Power Pivot не може да намери колоните и таблиците, указани във формулата, ще получите съобщение за грешка.

Контекстът се определя, както е описано в предните раздели, като се използват наличните таблици в работната книга, релациите между таблиците и всички приложени филтри.

Ако например току-що сте импортирали данни в нова таблица и не сте приложили никакви филтри, целият набор от колони в таблицата е част от текущия контекст. Ако имате множество таблици, които са свързани чрез релации, и работите в обобщена таблица, която е филтрирана чрез добавяне на заглавия на колони и използване на сегментатори, контекстът включва свързаните таблици и всички филтри на данните.

Контекстът е мощно понятие, което може също да затрудни отстраняването на неизправности във формули. Препоръчваме ви да започнете с прости формули и релации, за да видите как работи контекстът, и след това да започнете да експериментирате с прости формули в обобщените таблици. Следващият раздел също така дава някои примери за това как формулите използват различни типове контекст, за да връщат динамично резултати.

Примери за контекст във формули

  • Функцията RELATED разширява контекста на текущия ред, за да включи стойностите в свързана колона. Това ви позволява да извършвате търсения. Примерът в тази тема илюстрира взаимодействието на филтрирането и контекста на реда.
  • Функцията FILTER ви позволява да зададете редовете, които да включите в текущия контекст. Примерите в тази тема също илюстрират как да вградите филтри в други функции, които извършват агрегиране.
  • Функцията ALL задава контекст във формула. Можете да я използвате, за да заместите филтри, които са приложени в резултат на контекста на заявката.
  • Функцията ALLEXCEPT ви позволява да премахнете всички филтри с изключение на един, който сте задали. И двете теми включват примери, които ви превеждат през създаването на формули и разбирането на сложния контекст.
  • Функциите EARLIER и EARLIEST ви позволяват да обхождате циклично таблици, като извършвате изчисления, като същевременно препращате към стойност от вътрешен цикъл. Ако сте запознати с концепцията за рекурсия и с вътрешните и външните цикли, ще оцените мощта, която осигуряват функциите EARLY и EARLY. Ако сте начинаещ в тези понятия, трябва да следвате стъпките в примера внимателно, за да видите как вътрешният и външният контекст се използват в изчисленията.

Най-горе на страницата

Цялост на връзките

В този раздел се обсъждат някои разширени понятия, свързани с липсващи стойности в таблици на Power Pivot, които са свързани с релации. Този раздел може да ви бъде полезен, ако имате работни книги с множество таблици и сложни формули и имате нужда от помощ за разбиране на резултатите.

Ако сте начинаещ в понятията за релационни данни, ви препоръчваме първо да прочетете уводната тема " Общ преглед на релациите".

Цялост на връзките и релации на Power Pivot

Power Pivot не изисква налагането на цялост на връзките между две таблици, за да се дефинира валидна релация. Вместо това се създава празен ред в края "един" на всяка релация "един към много", който се използва за обработка на всички несъвпадащи редове от свързаната таблица. Той ефективно се държи като SQL външно съединение.

В обобщените таблици, ако групирате данни от страната "един" на релацията, всички данни без съответствия от страната "много" на връзката се групират заедно и ще бъдат включени в общите суми със заглавие на празен ред. Празното заглавие е приблизително еквивалентно на "неизвестен член".

Разбиране на неизвестния член

Концепцията за неизвестния член вероятно ви е позната, ако сте работили с многомерни системи за бази данни, като например Услуги за анализ на SQL Server. Ако този термин е нов за вас, следващият пример обяснява какво представлява неизвестният член и как влияе върху изчисленията.

Да предположим, че създавате изчисление, което сумира месечните продажби за всеки магазин, но в дадена колона от таблицата " Продажби " липсва стойност за името на магазина. Като се има предвид, че таблиците за магазин и продажби са свързани чрез името на магазина, какво очаквате да се случи във формулата? Как обобщената таблица трябва да групира или показва стойностите за продажбите, които не са свързани със съществуващ магазин?

Този проблем е често срещан в складовете за данни, където големите таблици с фактически данни трябва да бъдат логически свързани с таблици с измерения, които съдържат информация за магазини, региони и други атрибути, които се използват за категоризиране и изчисляване на факти. За да се реши проблемът, всички нови факти, които не са свързани със съществуващ обект, се присвояват временно на неизвестния член. Ето защо несвързани факти ще се появяват групирани в обобщена таблица под празно заглавие.

Обработка на празни стойности спрямо празен ред

Празните стойности се различават от празните редове, които се добавят, за да се приспособят към неизвестния член. Празната стойност е специална стойност, която се използва за представяне на празни стойности, празни низове и други липсващи стойности. За повече информация относно празната стойност, както и за други типове данни на DAX, вижте "Типове данни в моделите на данни".

Най-горе на страницата