<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Ilya Shelegin</title><generator>teletype.in</generator><description><![CDATA[Ilya Shelegin]]></description><image><url>https://img4.teletype.in/files/79/69/79699930-9bfb-4083-a36c-f4513345abc0.jpeg</url><title>Ilya Shelegin</title><link>https://bianalysis.ru/</link></image><link>https://bianalysis.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/iashell?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/iashell?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 28 Apr 2026 12:54:37 GMT</pubDate><lastBuildDate>Tue, 28 Apr 2026 12:54:37 GMT</lastBuildDate><item><guid isPermaLink="true">https://bianalysis.ru/PERCENT</guid><link>https://bianalysis.ru/PERCENT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/PERCENT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Тяжёлая доля. Как посчитать долю или процент от целого в PowerBI</title><pubDate>Tue, 07 Mar 2023 12:48:09 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/bf/42/bf426212-a9a5-4442-a53f-af36fa514f1a.png"></media:content><category>DAX</category><tt:hashtag>доля</tt:hashtag><tt:hashtag>процент</tt:hashtag><tt:hashtag>all</tt:hashtag><tt:hashtag>allexcept</tt:hashtag><tt:hashtag>allselected</tt:hashtag><description><![CDATA[<img src="https://img4.teletype.in/files/f1/d0/f1d0db5b-f031-4ce2-a2b8-f7995299ead1.png"></img>Оценивая результаты работы, мы, как правило, сравниваем или с плановыми показателями, или с аналогичным значением в прошлом, или проводим сравнение с себе подобными.]]></description><content:encoded><![CDATA[
  <tt-tags id="pWBc">
    <tt-tag name="доля">#доля</tt-tag>
    <tt-tag name="процент">#процент</tt-tag>
    <tt-tag name="all">#all</tt-tag>
    <tt-tag name="allexcept">#allexcept</tt-tag>
    <tt-tag name="allselected">#allselected</tt-tag>
  </tt-tags>
  <p id="0nuh">Оценивая результаты работы, мы, как правило, сравниваем или с <a href="https://bianalysis.ru/PLANS_DAYS" target="_blank">плановыми показателями</a>, или с <a href="https://bianalysis.ru/DATEADD" target="_blank">аналогичным значением в прошлом</a>, или проводим сравнение с себе подобными.</p>
  <p id="KAsm">Но, если просто сравнивать абсолютные значения, то сделать какие-то выводы будет сложно, не зная контекста. Например, продажи трёх категорий различаются на 400-500 тысяч. Это много или мало?</p>
  <figure id="L6jO" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f1/d0/f1d0db5b-f031-4ce2-a2b8-f7995299ead1.png" width="594" />
    <figcaption>Продажи категорий в рублях</figcaption>
  </figure>
  <p id="5lM7">Я специально сделал визуализацию, в которой немного значений, так что можно визуально увидеть и итоговое значение, и самое большое, и самое маленькое. Тем самым оценив значимость отклонений. Но на это всё тратится время и усилия, что отвлекает пользователя от конечной цели.  Облегчить восприятие можно двумя способами. Представить данные графически:</p>
  <figure id="QXub" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9f/6c/9f6c86c5-d10c-4d9f-9b41-13b3376482bc.png" width="895" />
    <figcaption>Продажи категорий в виде гистограммы</figcaption>
  </figure>
  <p id="w0NC">Или изменить их представление, показав их относительную значимость в общем значении:</p>
  <figure id="jFBw" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/07/48/0748e02f-a2f3-4f40-8eeb-9cc124eb94b4.png" width="863" />
    <figcaption>Доли продаж категорий</figcaption>
  </figure>
  <p id="nVH1">Чтобы получить процент от общего значения, можно воспользоваться неявными мерами, которые создаются с помощью интерфейса. Для этого достаточно добавить меру или столбец в поле значений, нажать правой клавишей мыши по ней и выбрать способ отображения &quot;Общий процент&quot;:</p>
  <figure id="qGmv" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/61/0a/610afab6-4476-4d85-8e93-1d8cfa861d43.png" width="806" />
    <figcaption>Создание неявной меры для расчёта доли продаж</figcaption>
  </figure>
  <p id="2Sni">И, хотя я всегда говорю: сначала вопрос - потом решение, - давайте сформулируем этот самый вопрос на основе полученной визуализации, чтобы затем самостоятельно написать меру, отвечающую на него.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="JEfP">Посчитай процент(долю) продаж отдельной категории от продаж всех выбранных категорий с учетом всех фильтров.</blockquote>
  </section>
  <p id="NHDO">Создадим визуализацию, где у нас будет три среза(фильтра) по году(<strong><em>Year</em></strong>), полу(<strong><em>Gender</em></strong>) покупателя и категории(<strong><em>Category</em></strong>)</p>
  <figure id="QBFi" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e1/90/e19059e9-c9f4-4867-9301-3164d1455c7c.png" width="1397" />
    <figcaption>Визуализация с неявной мерой</figcaption>
  </figure>
  <p id="ZKqm">Создадим первую меру, с помощью функции <a href="https://dax.guide/all/" target="_blank">ALL</a>:</p>
  <figure id="rZGz" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b5/f5/b5f5d731-8659-43ee-8445-ca786afc555e.png" width="1161" />
    <figcaption>Именованная мера с функцией ALL</figcaption>
  </figure>
  <p id="ddyg">Добавляем меру в визуализацию:</p>
  <figure id="Lrhk" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8b/04/8b04cbd1-e1ab-4d6f-8ff0-61631a6886c3.png" width="1658" />
    <figcaption>Сравнение работы неявной и именованной меры без фильтров</figcaption>
  </figure>
  <p id="PH1n">Значения написанной нами меры и неявной меры - идентичны.</p>
  <p id="Cs7e">Установим фильтр по году - 2018:</p>
  <figure id="kBWV" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/02/92/02923a11-8c89-45a9-85ad-794ad92675bd.png" width="1633" />
    <figcaption>Сравнение работы неявной и именованной меры с фильтром по году</figcaption>
  </figure>
  <p id="ZJAO">Условие вопроса &quot;<em>с учетом всех фильтров</em>&quot; выполняется. Значения по прежнему одинаковые, а доли рассчитаны от итоговых продаж за 2018-й год.</p>
  <p id="IEvg">Добавим фильтр по полу:</p>
  <figure id="HbcM" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/41/56/41564f44-85eb-462a-9876-d14963a49f54.png" width="1636" />
    <figcaption>Сравнение работы неявной и именованной меры с фильтром по году и полу</figcaption>
  </figure>
  <p id="tNqr">Результат соответствует ожиданиям.</p>
  <p id="E15e">Но в вопросе ещё было &quot;<em>от продаж всех выбранных категорий</em>&quot;. Давайте это и сделаем:</p>
  <figure id="6pzX" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/82/52/8252f9b8-533c-4ebd-b7cc-29fcccc1db9c.png" width="1434" />
    <figcaption>Сравнение работы неявной и именованной меры с фильтром по категориям</figcaption>
  </figure>
  <p id="zDv0">Значение написанной нами меры не соответствует ожиданиям. Это хорошо видно по строке итогов, где вместо <strong>100%</strong> мы видим <strong>58,91%</strong>. Это происходит потому, что функция <a href="https://dax.guide/all/" target="_blank">ALL</a> в соответствии со своим названием возвращает <strong><em>ВСЕ </em></strong>значения из указанного столбца, удалив <strong><em>ВСЕ </em></strong>фильтры, примененные к нему.</p>
  <p id="zF33">Попробуем воспользоваться функцией <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a>:</p>
  <figure id="7OLP" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/25/3b/253b8712-48a0-4e35-862c-cfeca0acd1ca.png" width="1532" />
    <figcaption>Именованная мера с функцией ALLEXCEPT</figcaption>
  </figure>
  <p id="6f9t">Добавим новую меру в визуализацию:</p>
  <figure id="8Nb0" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4b/2e/4b2ec72b-dc6a-4c19-a533-659a1615c5f2.png" width="1581" />
    <figcaption>Сравнение работы неявной и именованной меры c ALLEXCEPT</figcaption>
  </figure>
  <p id="A8JA">Почему теперь везде <strong>100%</strong>? Для этого обратимся к определению функции <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="iXBr">Возвращает все строки в таблице, за исключением тех строк, на которые влияют указанные фильтры столбцов</blockquote>
  </section>
  <p id="2mFC">То есть, мы наоборот сбросили <strong><em>ВСЕ </em></strong>фильтры с таблицы <strong><em>Products</em></strong>, кроме столбца <strong><em>Category</em></strong>, так как каждая строка визуализации имеет свой контекст вычисления (подробнее о работе контекстов можно почитать <a href="https://bianalysis.ru/CONTEXT1" target="_blank">здесь</a>).</p>
  <p id="olD1">Что ж, воспользуемся третьей функцией из семейства <strong><em>ALL </em></strong>- <a href="https://dax.guide/allselected/" target="_blank">ALLSELECTED</a>:</p>
  <figure id="UxEn" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f7/19/f71991ed-33bd-4789-85b0-0b2a2d3d66b3.png" width="1365" />
    <figcaption>Именованная мера с функцией ALLSELECTED</figcaption>
  </figure>
  <p id="aR0v">Сравним полученный результат:</p>
  <figure id="7BrC" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e9/03/e903e2f4-eb2b-4bf3-b4c5-132254d2033c.png" width="2021" />
    <figcaption>Сравнение работы неявной и именованной меры c ALLSELECTED</figcaption>
  </figure>
  <p id="Susr">Полученный результат идентичен значению неявной меры и полностью отвечает поставленному вопросу.</p>
  <p id="ryH4">Но что если усложнить задачу и добавить ещё и месяцы в визуализацию?</p>
  <p id="UlzQ">Сначала визуализация с неявной мерой:</p>
  <figure id="ZNGb" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/31/75/31754371-7030-4484-9c7b-7ef5070181a4.png" width="2674" />
    <figcaption>Матрица по месяцам с неявной мерой</figcaption>
  </figure>
  <p id="cKEf">На примере января видно, что расчёт доли идёт от &quot;<em>общего значения</em>&quot;, то есть за весь год.</p>
  <p id="Lqbx">А как считает мера написанная самостоятельно:</p>
  <figure id="bu8E" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/cb/93/cb93b471-9568-4da6-a267-2d34908af692.png" width="2689" />
    <figcaption>Матрица по месяцам с именованной мерой</figcaption>
  </figure>
  <p id="PJ7U">Итог по каждому месяцу равен <strong>100%</strong>, то есть в такой визуализации именованная мера правильнее отвечает на поставленный вопрос, нежели неявная мера.</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VRo9">Подводя итоги, хочу ещё раз отметить: сначала формулируем вопрос - затем создаём решение, выбирая для этого нужные функции.</p>
  </section>
  <p id="Joc0"><a href="https://cloud.mail.ru/public/bb8F/fKYv416aG" target="_blank">Ссылка</a> на отчёт.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/AXYS_CUR_DAY</guid><link>https://bianalysis.ru/AXYS_CUR_DAY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/AXYS_CUR_DAY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Как выделить на графике текущее значение</title><pubDate>Fri, 24 Feb 2023 11:04:31 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2c/3f/2c3f652f-ca00-45e3-8a89-9470898d0306.png"></media:content><category>Visualisations</category><tt:hashtag>текущий</tt:hashtag><tt:hashtag>оси</tt:hashtag><tt:hashtag>выделить</tt:hashtag><tt:hashtag>подсветить</tt:hashtag><tt:hashtag>день</tt:hashtag><tt:hashtag>месяц</tt:hashtag><tt:hashtag>powerbi</tt:hashtag><description><![CDATA[<img src="https://img4.teletype.in/files/bd/a6/bda67d9c-f125-4513-82d1-e111d6b94b46.png"></img>Создавая отчёты, мы стараемся помочь конечному пользователю, как можно скорее увидеть самое важное. Для этого используем различные индикаторы, подсказки. Так, одним из часто используемых маркеров является сравнение текущего значения с прочими. И, чтобы помочь пользователю быстрее увидеть текущее значение, его можно подсветить, выделив другим цветом.]]></description><content:encoded><![CDATA[
  <tt-tags id="jlbU">
    <tt-tag name="текущий">#текущий</tt-tag>
    <tt-tag name="оси">#оси</tt-tag>
    <tt-tag name="выделить">#выделить</tt-tag>
    <tt-tag name="подсветить">#подсветить</tt-tag>
    <tt-tag name="день">#день</tt-tag>
    <tt-tag name="месяц">#месяц</tt-tag>
    <tt-tag name="powerbi">#powerbi</tt-tag>
  </tt-tags>
  <p id="g1zp">Создавая отчёты, мы стараемся помочь конечному пользователю, как можно скорее увидеть самое важное. Для этого используем различные индикаторы, подсказки. Так, одним из часто используемых маркеров является сравнение текущего значения с прочими. И, чтобы помочь пользователю быстрее увидеть текущее значение, его можно подсветить, выделив другим цветом.</p>
  <p id="RDQL">Например, для диаграммы с типом <strong><em>Гистограмма </em></strong>это сделать достаточно просто с использованием условного форматирования:</p>
  <figure id="EMsu" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/bd/a6/bda67d9c-f125-4513-82d1-e111d6b94b46.png" width="1163" />
    <figcaption>Текущий день на гистограмме</figcaption>
  </figure>
  <p id="j53K">Для определения текущей даты используется разметка в справочнике <strong><em>Календарь </em></strong>( подробнее про это можно почитать в серии статей <a href="https://bianalysis.ru/big-date-part3" target="_blank">&quot;Биг Дата&quot;</a>)</p>
  <figure id="e89j" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/99/df/99df4f58-546e-4327-a175-e752846182dc.png" width="1161" />
    <figcaption>Настройка условного форматирования для подсветки текущего дня</figcaption>
  </figure>
  <p id="7d9J">Но, в диаграмме с типом <strong><em>График</em></strong> такой возможности нет. За то можно создать меру, которая будет возвращать <em>ТОЛЬКО </em>текущее значение:</p>
  <figure id="arsU" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ac/48/ac4856ae-4667-486d-8450-b51b22d9fff0.png" width="719" />
    <figcaption>Мера суммы продаж только за текущий день</figcaption>
  </figure>
  <p id="y4zd">Полученную меру добавляем на график и настраиваем соответствующее форматирование:</p>
  <figure id="gV9E" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/23/69/23694389-fcea-4f66-93a6-74240c3cc690.png" width="1594" />
    <figcaption>Точка значения текущего дня на графике</figcaption>
  </figure>
  <p id="z0A4">У такого способа есть свои недостатки. Например, в легенде и в подсказке будут отображаться две меры. Но, легенду можно отключить, а подсказку использовать не стандартную, а настроить самостоятельно.</p>
  <p id="Ln9r">А что, если заказчик просит подсветить или выделить текущее значение именно на оси? Стандартно пока такой возможности нет, но можно пойти на небольшую хитрость и всё таки отформатировать значения на оси.</p>
  <p id="LU1C">Для начала сделаем это для текущей даты. Для этого необходимо будет создать столбец в справочнике <strong><em>Календарь</em></strong>, где и задать соответствующее форматирование:</p>
  <figure id="DZhW" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f4/7f/f47f5d54-c68b-404e-8a2a-c6c3022bd148.png" width="751" />
    <figcaption>Столбец с форматированием текущей даты</figcaption>
  </figure>
  <p id="ZWgG">Для выделения текущей даты я использовал квадратные скобки и функцию формат, соответственно в столбце получились текстовые значения, хотя и представленные как даты. Поэтому для правильной визуализации необходимо задать сортировку по другому столбцу - <strong><em>Дата</em></strong>:</p>
  <figure id="EIdt" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/23/17/2317453a-acf3-4673-9d1c-c3b36e002095.png" width="1593" />
    <figcaption>Настройка правильной сортировки для столбца с форматированием</figcaption>
  </figure>
  <p id="TQ2f">Добавляем созданный столбец в диаграмму и получаем:</p>
  <figure id="5Ewt" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/10/87/1087d575-2922-4dc1-a6f9-c1582733a903.png" width="1326" />
    <figcaption>График с форматированной осью</figcaption>
  </figure>
  <p id="HVb2">Текста слишком много и такие скобки не очень заметны, хотя условия задачи выполнены. </p>
  <p id="M8MP">Давайте попробуем уменьшить количество текста и читабельность, заменив даты на месяц и день(число). Для этого также создадим в справочнике <strong><em>Календарь</em></strong> специальный столбец:</p>
  <figure id="wkzc" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d0/f9/d0f974b8-52e1-4566-bf1e-690c47166c98.png" width="664" />
    <figcaption>Столбец с форматированием текущего числа</figcaption>
  </figure>
  <p id="bDy7">Функция практически не отличается от предыдущей, которую использовали для дат. Главное не забыть задать сортировку по правильному столбцу.</p>
  <figure id="xmX6" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ea/bc/eabc3891-88b9-4564-82f6-3da11996c7c6.png" width="1325" />
    <figcaption>График с форматированной осью по дням месяца</figcaption>
  </figure>
  <p id="QWAi">Стало более читабельно, но хочется более ярко. Для этого можно воспользоваться функцией <a href="https://dax.guide/unichar/" target="_blank">UNICHAR</a>:</p>
  <figure id="PCUb" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/95/e7/95e7efae-3d12-46d2-b2fc-dd29aa45b52f.png" width="793" />
    <figcaption>Столбец с форматированием текущего числа с символом UNICHAR</figcaption>
  </figure>
  <p id="bV86">Вот так больше бросается в глаза:</p>
  <figure id="ZIUy" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4d/6b/4d6b9094-3478-4616-9337-03b5f81543d7.png" width="1359" />
    <figcaption>График с форматированной осью по дням месяца с UNICHAR</figcaption>
  </figure>
  <p id="dYXq">Как видите, способов подсветить или выделить нужное значение достаточно, даже используя стандартные визуализации. Главное определить цель для чего это нужно и исходя их этого выбрать подходящее решение.</p>
  <p id="7s4l">Файл пример по <a href="https://cloud.mail.ru/public/T7Tq/3yL39WLy6" target="_blank">ссылке</a>.</p>
  <figure id="gjHZ" class="m_column">
    <iframe src="https://app.powerbi.com/view?r=eyJrIjoiMWZkNzQyYjMtYTAzMS00Yjk4LWJlYTctZDdlNjZkZGM5YzkyIiwidCI6IjRlMjE5ZWNhLTRkMTQtNDYxZS04ZWVkLWQxYzkzN2E4MTVjNiIsImMiOjl9"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/PLANS_DAYS</guid><link>https://bianalysis.ru/PLANS_DAYS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/PLANS_DAYS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>План - отобрать и поделить!</title><pubDate>Mon, 19 Dec 2022 15:47:24 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/82/c1/82c125dc-39d8-470e-85e3-2f17fe233682.png"></media:content><category>DAX</category><tt:hashtag>powerbi</tt:hashtag><tt:hashtag>план</tt:hashtag><tt:hashtag>месячный</tt:hashtag><tt:hashtag>по_дням</tt:hashtag><tt:hashtag>разделить</tt:hashtag><tt:hashtag>рабочие_дни</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/aa/37/aa37dfcd-2cbb-4c40-9737-c1906a5b0685.png"></img>Большие начальники любят ставить большие планы, но не любят их составлять. Поэтому, чаще всего, данные о планах - это значения на целый месяц или год, которые затем требуется поделить на дни.]]></description><content:encoded><![CDATA[
  <tt-tags id="1AGP">
    <tt-tag name="powerbi">#powerbi</tt-tag>
    <tt-tag name="план">#план</tt-tag>
    <tt-tag name="месячный">#месячный</tt-tag>
    <tt-tag name="по_дням">#по_дням</tt-tag>
    <tt-tag name="разделить">#разделить</tt-tag>
    <tt-tag name="рабочие_дни">#рабочие_дни</tt-tag>
  </tt-tags>
  <p id="qa2u">Большие начальники любят ставить большие планы, но не любят их составлять. Поэтому, чаще всего, данные о планах - это значения на целый месяц или год, которые затем требуется поделить на дни.</p>
  <p id="qlv0">В качестве примера возьмём простую модель, где будет только три таблицы: календарь, план и факт.</p>
  <p id="egch">На этот раз я использую производственный календарь, который я загрузил с сайта Консультант и который учитывает не только выходные дни, но и праздничные, а также переносы выходных с ними связанные (<em>спасибо <strong>Алексей (PooHkrd) Семилетов</strong> за создание календаря, а о том как создать календарь с помощью DAX читайте в <a href="https://bianalysis.ru/big-date-part3" target="_blank">другой</a> моей статье</em>).</p>
  <figure id="Bf6d" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/aa/37/aa37dfcd-2cbb-4c40-9737-c1906a5b0685.png" width="673" />
    <figcaption>Производственный календарь</figcaption>
  </figure>
  <p id="RcVs">Таблица фактов <strong><em>Orders </em></strong>содержит информацию о продажах по дням:</p>
  <figure id="XVw3" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/50/b4/50b4941d-322d-4c72-9d67-5e8148f0128d.png" width="716" />
    <figcaption>Таблица фактов</figcaption>
  </figure>
  <p id="W8y1">А вот планы разбиты по месяцам (<em>месяц указан в формате даты первого числа месяца</em>):</p>
  <figure id="nGGl" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/85/28/8528af37-5bd3-4d46-86e9-4b3996c92cdc.png" width="242" />
    <figcaption>Таблица планов</figcaption>
  </figure>
  <p id="RLU9">Так как и факты, и планы содержат столбец с датами, то свяжем их с календарем по дате:</p>
  <figure id="slKK" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/72/71/7271abc3-8e85-45fd-9eea-56cb55cba974.png" width="891" />
    <figcaption>Схема связей модели</figcaption>
  </figure>
  <p id="Dw5y">Также нам понадобится несколько мер:</p>
  <figure id="yKHw" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fc/48/fc489856-25e3-4d6b-9efe-6118e8a35d59.png" width="1074" />
    <figcaption>Базовые меры</figcaption>
  </figure>
  <p id="Nm7a">Перейдём к визуализации и посмотрим на меры, сначала по годам:</p>
  <figure id="BIkj" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/42/98/42984f07-ff3d-4581-ae8d-392b2c6065d5.png" width="583" />
    <figcaption>План и факт по годам</figcaption>
  </figure>
  <p id="IR4K">Затем по месяцам:</p>
  <figure id="IaOe" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d7/ce/d7ce64bc-bae8-4045-81fc-d9f375ce89d7.png" width="1361" />
    <figcaption>План и факт в разбивке Год-месяц</figcaption>
  </figure>
  <blockquote id="ZWUV"><em>Столбец StartMonth в календаре отформатирован с помощью пользовательского формата, подробнее как это сделать можно прочитать <a href="https://bianalysis.ru/custom-format" target="_blank">здесь</a>.</em></blockquote>
  <p id="AIt3">А теперь развернём один месяц до дней:</p>
  <figure id="6QZd" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3b/f7/3bf768d8-e3cb-4f24-8a86-db04948ad285.png" width="618" />
    <figcaption>План и факт по дням</figcaption>
  </figure>
  <p id="0xOt">Факты бьются по дням, а вот месячный план весь записан на первое число месяца, так как таблица <strong><em>Plans </em></strong>связана с календарём по столбцу дат, а в самой таблице планов месяц указан в виде <strong>&quot;01.ММ.ГГГГ&quot;</strong>.</p>
  <h3 id="neTx">Как показать значение плана на каждый день?</h3>
  <p id="exRy">Одно из решений - это создать промежуточную таблицу уникальных значений &quot;<strong><em>Год-месяц</em></strong>&quot; или &quot;<strong><em>StartMonth</em></strong>&quot; и связать таблицу планов с календарём через неё.</p>
  <p id="u4Lx">Так как у меня планы <strong><u>БЕЗ</u> </strong>какой-либо разбивки, <u><strong>кроме месяцев</strong></u>, то мне такая таблица не нужна и я просто могу связать столбцы <strong><em>Plans[Month Plan]</em></strong> и <strong><em>Calendar[StartMonth]:</em></strong></p>
  <figure id="kULL" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a8/a9/a8a9b559-7fc1-4f93-9a1a-3c5f75f94ef1.png" width="542" />
    <figcaption>Связь календаря и планов по месяцу</figcaption>
  </figure>
  <p id="wMPd">А так как поле <strong><em>Calendar[StartMonth]</em></strong> содержит повторяющиеся значения, то необходимо будет установить двунаправленную связь, чтобы можно было передавать фильтр из календаря и в факты, и в планы:</p>
  <figure id="XAce" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e6/21/e62119a3-b349-4f34-b30f-ac0325bf1f31.png" width="564" />
    <figcaption>Месячный план на каждый день</figcaption>
  </figure>
  <p id="uB5o">Теперь план есть на каждую дату, но всё ещё является некорректным, так как это значение месячного плана, а не дневного. И здесь также есть несколько решений: </p>
  <ul id="8jUi">
    <li id="87zU">разделить на количество дней в месяце ДО загрузки в модель</li>
    <li id="ckmF">разделить на количество дней в месяце в мере</li>
  </ul>
  <p id="fquo">Воспользуемся вторым способом, а за одно и откажемся от промежуточных таблиц, посчитав планы на каждую дату с помощью меры, при этом связь будет использоваться <strong><em>Calendar[Date]-&gt;Plans[Month Plan]</em></strong>.</p>
  <figure id="gzZh" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d2/ac/d2ac4780-9650-42be-9d0d-b1f46c8117b1.png" width="605" />
    <figcaption>Месячный план на каждую дату с помощью меры</figcaption>
  </figure>
  <p id="kWD5">С помощью функции <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a> оставим фильтр по таблице дат только по столбцу <strong><em>StartMonth</em></strong>.</p>
  <p id="KmmX">Чтобы разделить месячный план по дням, необходимо получить число дней в месяце. Это можно сделать несколькими способами, например с помощью функции <a href="https://dax.guide/eomonth/" target="_blank">EOMONTH</a>:</p>
  <figure id="8VOL" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5b/0d/5b0d2733-50e1-450d-a088-dca30e8571bf.png" width="782" />
    <figcaption>План деленный на количество дней в месяце</figcaption>
  </figure>
  <p id="Frh4">Но, как всегда, есть нюансы - в строке итогов теперь план на день. Это можно обработать с помощью функции <a href="https://dax.guide/isinscope/" target="_blank">ISINSCOPE</a>:</p>
  <figure id="yde0" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/86/4e/864e2e05-d47b-4df0-875c-2cc3bf9f4e3b.png" width="835" />
    <figcaption>Обработка итогов</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="eTS8"><em>Для особо внимательных читателей: если сложить значения дневного плана за месяц, то получим 101+101+...101=3131, а не 3125. Просто значения меры отформатированы до целого числа, на самом деле там 3125/31=100,80645.. Тоже самое касается и дальнейших расчётов - это просто заданный формат отображения в виде целого числа.</em></blockquote>
  </section>
  <p id="VDfZ">А можно добавить более универсальную обработку:</p>
  <figure id="hwRS" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d6/c3/d6c3917e-e2cb-457f-9c1e-552b732f0000.png" width="900" />
    <figcaption>Еще один вариант расчета дневного плана</figcaption>
  </figure>
  <p id="mK0E">Теперь, если в фильтре будет выбран не полный месяц, то и в строке итогов будет считаться план на выбранное количество дней:</p>
  <figure id="taiy" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e7/43/e74358a1-4fd5-466d-953b-a2f8707463f8.png" width="606" />
    <figcaption>Некорректный план на неполный месяц</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="RyGH">СТОП!!! Тут вообще какие-то непонятные цифры. Откуда они взялись? Это произошло из-за того, что я теперь использую в качестве фильтра не столбец <strong><em>StartMonth</em></strong>, а столбец <strong><em>Date</em></strong>. А функция <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a> не может добавлять фильтры - она их только сохраняет. Подробнее об этом можно прочитать у <a href="https://www.sqlbi.com/articles/using-allexcept-versus-all-and-values/" target="_blank">Марко Руссо и Альберто Феррари</a>.</p>
  </section>
  <p id="LjYR">Я же просто создам новую меру:</p>
  <figure id="DFDZ" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4b/d4/4bd421b0-2241-4465-9cf9-6c03dfcb06a5.png" width="446" />
    <figcaption>Корректный план на неполный месяц</figcaption>
  </figure>
  <p id="eSyt">Но, не зря же я использовал в этом файле производственный календарь. Определение количества дней в месяце по последнему дню подойдёт, если вы работаете каждый день. Но, если вы осуществляете продажи только в рабочие дни, при этом необходимо учитывать праздники и переносы, то шаблон меры дневного плана необходимо будет изменить:</p>
  <figure id="9gLI" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1d/c6/1dc64aa3-3286-4385-8b93-42afb988c37c.png" width="575" />
    <figcaption>Распределение плана только по рабочим дням</figcaption>
  </figure>
  <p id="qkNi">Всего в ноябре 2022 года был 21 рабочий день и 9 выходных в том числе 4-е число пятница - День народного единства. Как видно на скриншоте, при распределении плана на все дни месяца и только рабочие дни - кардинально меняется результат.</p>
  <p id="L43s">Целью этой статьи было показать различные способы решения одной и той же задачи. Некоторые способы лучше, некоторые хуже. Но в большей степени их эффективность будет зависеть от данных в вашей модели, их структуры, от визуализаций в отчёте и фильтров, которые вы используете. И, прежде всего, от вопросов, на которые вы хотите ответить.</p>
  <p id="zkPt"><a href="https://cloud.mail.ru/public/GL6u/ThreqYQZd" target="_blank">Ссылка</a> на скачивание файла с мерами.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/CONTEXT2</guid><link>https://bianalysis.ru/CONTEXT2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/CONTEXT2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>#PowerBI: контекст и константы</title><pubDate>Wed, 14 Dec 2022 14:31:00 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c3/e4/c3e4dc73-a9e3-4bdb-97de-dcb7a3f75777.png"></media:content><category>DAX</category><tt:hashtag>context</tt:hashtag><tt:hashtag>контекст</tt:hashtag><tt:hashtag>константы</tt:hashtag><tt:hashtag>variables</tt:hashtag><tt:hashtag>фильтры</tt:hashtag><tt:hashtag>вычисление</tt:hashtag><tt:hashtag>calculate</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/c5/07/c5074d80-3368-407e-aa0a-016fc5af5ef3.png"></img>Разобраться в работе контекста в языке #DAX бывает не просто. Иногда кажется, что вот - уловил уже суть, но вдруг получаешь результат, который не можешь объяснить.]]></description><content:encoded><![CDATA[
  <tt-tags id="cm5e">
    <tt-tag name="context">#context</tt-tag>
    <tt-tag name="контекст">#контекст</tt-tag>
    <tt-tag name="константы">#константы</tt-tag>
    <tt-tag name="variables">#variables</tt-tag>
    <tt-tag name="фильтры">#фильтры</tt-tag>
    <tt-tag name="вычисление">#вычисление</tt-tag>
    <tt-tag name="calculate">#calculate</tt-tag>
  </tt-tags>
  <p id="SnAe">Разобраться в работе контекста в языке <strong>#DAX</strong> бывает не просто. Иногда кажется, что вот - уловил уже суть, но вдруг получаешь результат, который не можешь объяснить.</p>
  <p id="vO8I">В прошлой <a href="https://bianalysis.ru/CONTEXT1" target="_blank">статье</a> о контекстах я попытался предложить упрощенный вариант понимания контекста фильтра. В ней я разбирал работу контекста на простом примере, не вдаваясь в подробности и теорию.</p>
  <p id="OmGQ">Сегодня же, хочу заглянуть чуть глубже и на примере одной визуализации рассказать о том, что может влиять на формирование контекста вычисления, какие функции используются для формирования визуального элемента и как на это могут повлиять константы, связи и наполнение визуальных элементов.</p>
  <p id="DzVb">За основу возьмём всю ту же модель данных:</p>
  <figure id="owhF" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c5/07/c5074d80-3368-407e-aa0a-016fc5af5ef3.png" width="1857" />
    <figcaption>Схема модели</figcaption>
  </figure>
  <p id="7cGg">Единственное, по какой-то причине в таблице фактов добавлен столбец <strong><em>Category</em></strong>, который соответственно содержит названия категорий товаров:</p>
  <figure id="DagB" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f7/35/f73538e0-9094-4ee5-9f7b-69cd8042e7cc.png" width="861" />
    <figcaption>Столбец категорий в таблице Sales</figcaption>
  </figure>
  <p id="5YoU">Хотя у нас есть информация о категориях товаров в связанной таблице <strong><em>Products</em></strong>:</p>
  <figure id="heAV" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/9d/169d38fa-10c3-4a05-8a17-0237d3f4bc5a.png" width="1063" />
    <figcaption>Столбец категорий в таблице Products</figcaption>
  </figure>
  <p id="q1QF">Также в модели создана мера, которая считает количество единиц проданного товара:</p>
  <figure id="lzfX" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/88/16/88163624-ac72-487c-a5bb-598a10b96040.png" width="1268" />
    <figcaption>Мера количества продаж</figcaption>
  </figure>
  <p id="anQI">На листе отчёта создадим визуальный элемент <strong>Таблица</strong> и добавим в него столбец  <strong><em>Category</em></strong> из таблицы <strong><em>Sales</em></strong>:</p>
  <figure id="zdSw" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/12/9a1219df-8700-4e07-82f0-6d6b8b57f09c.png" width="907" />
    <figcaption>Столбец категорий из таблицы Sales в визуализации</figcaption>
  </figure>
  <p id="1hPu">Для того, чтобы отобразить визуальный элемент, движку <strong>PowerBI </strong>необходимо вычислить таблицу, которая получается в результате группировки. Чтобы посмотреть как это происходит, воспользуемся функционалом анализатора производительности (<em>вкладка &quot;Представление&quot; - &quot;Анализатор производительности&quot; - &quot;Таблица&quot; - &quot;Запрос DAX&quot; - &quot;Копировать запрос&quot;</em>)</p>
  <figure id="iVct" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b3/ef/b3ef3258-b106-452f-98d2-c3bd5a8a1d8b.png" width="2133" />
    <figcaption>Использование Анализатора производительности</figcaption>
  </figure>
  <p id="9j9A">Далее скопируем запрос и вставим его в <strong>DAX Studio</strong>:</p>
  <figure id="6PRr" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d6/c8/d6c8a7c0-51d9-40b9-8f06-123c8244ffc5.png" width="899" />
    <figcaption>Запрос таблицы в визуализации</figcaption>
  </figure>
  <blockquote id="9oBZ"><em>Я убрал лишние строки, где результат запроса ограничивается на 500 строк, т.к. это никак не влияет на результат</em></blockquote>
  <p id="Omma">Из запроса видно, что для отображения в таблице, с помощью табличной функции <a href="https://dax.guide/distinct/" target="_blank">DISTINCT</a> формируется таблица категорий товаров на основании столбца <strong><em>Category</em></strong> таблицы <strong><em>Sales</em></strong>. Никаких фильтров у нас нет, поэтому в визуальном элементе отображаются все категории, по которым были продажи.</p>
  <p id="zXqT">Но заказчик хочет видеть информацию только по категории <strong><em>Bikes</em></strong>, поэтому добавим в панель фильтров соответствующие условие:</p>
  <figure id="szT5" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/ba/9aba3c2d-de80-4536-b920-9a1da255cab0.png" width="1383" />
    <figcaption>Таблица и фильтр по справочнику</figcaption>
  </figure>
  <p id="Vs7p">Только вот в фильтр мы добавили столбец <strong><em>CategoryName</em></strong> из таблицы <strong><em>Products</em></strong>, но в визуализации отображается ожидаемый результат в виде одной категории.</p>
  <p id="dOX3">Посмотрим на текст запроса:</p>
  <figure id="TZg4" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/be/81/be81318c-b5b2-4bf9-b479-8cbfbd765c57.png" width="1367" />
    <figcaption>Запрос с фильтром по таблице</figcaption>
  </figure>
  <p id="Sl8f">Для отображения таблицы по прежнему используется функция <a href="https://dax.guide/distinct/" target="_blank">DISTINCT</a>, но на этот раз она обернута в функцию <a href="https://dax.guide/calculatetable/" target="_blank">CALCULATETABLE</a>, с помощью которой добавляется контекст вычисление с фильтром по таблице <strong><em>Products</em></strong>, который передаётся по связи между таблицами.</p>
  <p id="0bon">А теперь добавим в визуализацию меру:</p>
  <figure id="DBgf" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a6/32/a632ff02-9e20-4b98-961a-7769c4b7546d.png" width="2030" />
    <figcaption>Таблица с мерой</figcaption>
  </figure>
  <p id="kJz8">И сразу посмотрим на код запроса:</p>
  <figure id="s4kf" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/94/b4/94b4eebf-c794-4fd6-bf7d-b460a60ce970.png" width="1536" />
    <figcaption>Запрос с мерой</figcaption>
  </figure>
  <p id="v4ux">Результат по прежнему тот, который мы ожидаем - в таблице отображены продажи по одной категории товаров. Но вот функция, которая формирует таблицу для отображения изменилась. Вместо <a href="https://dax.guide/distinct/" target="_blank">DISTINCT</a> теперь используется функция <a href="https://dax.guide/summarizecolumns/" target="_blank">SUMMARIZECOLUMNS</a>. </p>
  <p id="SEYi">Но, прежде чем обратиться к описанию данной функции, создадим новую меру, практически идентичную текущей, за исключением того, что в неё добавлена константа в виде 0:</p>
  <figure id="AAaB" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d0/b5/d0b546bc-6860-4067-90da-536f68aa0d85.png" width="1454" />
    <figcaption>Мера с константой</figcaption>
  </figure>
  <blockquote id="zctz"><em>Такой приём используется довольно часто, чтобы вместо пустоты(BLANK) показывать 0. </em></blockquote>
  <p id="aXFt">Скопируем визуальный элемент и заменим в нём меру, чтобы было удобнее сравнивать:</p>
  <figure id="rIml" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/82/01/8201d8f2-ffa0-414e-8d6b-3f75dc6e683e.png" width="955" />
    <figcaption>Таблица с новой мерой +0</figcaption>
  </figure>
  <p id="5tFi">Значение по категории <strong><em>Bikes</em></strong> не изменилось, но появились две категории с нулевым значением, хотя вы по прежнему могли ожидать получить одну категорию, которая выбрана в панели фильтров, ведь таблицы связаны между собой и направление фильтра по связи от <strong><em>Products</em></strong> в <strong><em>Sales</em></strong>. Посмотрим запрос:</p>
  <figure id="YTvN" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/89/e0895912-d2a0-44ac-bd21-dd445575c895.png" width="1657" />
    <figcaption>Запрос с использованием меры с константой</figcaption>
  </figure>
  <p id="JV7l">Запрос идентичен запросу с изначальной мерой. Почему же там показывается одна категория, а здесь три?</p>
  <p id="1BY2">Вот здесь стоит обратиться к теории и описанию функции <a href="https://dax.guide/summarizecolumns/" target="_blank">SUMMARIZECOLUMNS</a>. До примечаний редко кто доходит или внимательно их читает, но здесь кроется вся суть:</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pjWF">Filters in SUMMARIZECOLUMNS only apply to group-by columns from the same table and to measures.</p>
  </section>
  <p id="KKIu">Или по-русски: Фильтры в <a href="https://dax.guide/summarizecolumns/" target="_blank">SUMMARIZECOLUMNS</a> применяются <u>ТОЛЬКО</u> к столбцам группировки из <u>ТОЙ  ЖЕ</u> таблицы и <u>К МЕРАМ</u>.</p>
  <p id="ijGs">А у нас столбец группировки и столбец фильтра находятся в <u>РАЗНЫХ</u> таблицах, поэтому происходит следующее:</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="M5eM">They do not apply to group-by columns from other tables directly, but indirectly through the implied non-empty filter from measures.</p>
  </section>
  <p id="pEuE">То есть, в этом случае к столбцам группировки фильтры из других таблиц применяются не напрямую, а косвенно через подразумеваемый &quot;непустой&quot; фильтр из мер. А в нашей новой мере появилась константа 0, то есть значение, уже вычисленное, на которое никакие фильтры не могут повлиять, поэтому мы как раз и получили &quot;непустое&quot; значение для каждой строки.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="WWOY"><em>Обратите внимание, что так будет работать только сложение и вычитание. Умножение или деление, допустим мы захотим умножить на какой-то коэффициент, по прежнему будут возвращать пустоту:</em></p>
    <p id="6j0r"><em>BLANK()+0 = 0</em></p>
    <p id="EqmN"><em>BLANK()-0 = 0</em></p>
    <p id="C27v"><em>BLANK() * 0 = BLANK()</em></p>
    <p id="Us7X"><em>DIVIDE(0,BLANK()) = BLANK()</em></p>
  </section>
  <p id="srEc">И в конце немного теории и дополнительное пояснение почему же оно так работает из книги <a href="https://dmkpress.com/catalog/computer/data/978-5-97060-859-3/" target="_blank">&quot;Подробное руководство по DAX&quot;</a>:</p>
  <blockquote id="9gg8"><em>Контекст строки осуществляет итерации по таблице, он не фильтрует. Речь идет о построчном сканировании таблицы и последовательном выполнении той или иной операции. Обычно в отчетах нам нужны какие-то агрегации вроде суммы или среднего значения. Во время прохода по таблице контекст строки <strong>перебирает строки конкретной таблицы</strong>, предоставляя доступ к информации по всем столбцам, <strong>но только из этой таблицы</strong>. В других таблицах – даже связанных с нашей – контекст строки в этот момент не создан. Иными словами, <strong>контекст строки сам по себе автоматически не взаимодействует с существующими в модели связями</strong>.</em></blockquote>
  <p id="FY9D">Именно поэтому, если мы хотим получить ожидаемый результат, в нашем визуальном элементе должен находиться столбец из той же таблицы, по которой мы осуществляем фильтрацию или по другому итерацию, просматривая столбец, чтобы выбрать нужные значения:</p>
  <figure id="DbmY" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fd/9a/fd9a6d02-0185-4910-85b6-eb096b29a3b0.png" width="2834" />
    <figcaption>Таблица со столбцом из справочника</figcaption>
  </figure>
  <figure id="4hgX" class="m_column">
    <img src="https://img1.teletype.in/files/08/c7/08c727ea-ce18-4511-9fa5-2b46d579621b.png" width="1685" />
  </figure>
  <p id="UBil"><a href="https://cloud.mail.ru/public/JHfB/whSdu2547" target="_blank">Ссылка</a> на файл с моделью.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/ConditionalFormating</guid><link>https://bianalysis.ru/ConditionalFormating?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/ConditionalFormating?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Условное форматирование цветом</title><pubDate>Thu, 20 Oct 2022 14:12:09 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ed/d4/edd4a761-b81b-4dd2-9f69-1f30797f31dc.png"></media:content><category>Visualisations</category><description><![CDATA[<img src="https://img3.teletype.in/files/6d/69/6d69e13f-b8ad-414d-8b59-496c737c0ec6.png"></img>Один из любимых инструментов у пользователей #Excel - условное форматирование. В #PowerBI также присутствует условное форматирование - с его помощью можно менять цвет значений (шрифта), фона или заливки в большинстве визуальных элементов. Пользователю доступны три способа форматирования цветом:]]></description><content:encoded><![CDATA[
  <p id="I03b">Один из любимых инструментов у пользователей <strong>#Excel</strong> - условное форматирование. В <strong>#PowerBI </strong>также присутствует условное форматирование - с его помощью можно менять цвет значений (шрифта), фона или заливки в большинстве визуальных элементов. Пользователю доступны три способа форматирования цветом:</p>
  <figure id="0dbu" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6d/69/6d69e13f-b8ad-414d-8b59-496c737c0ec6.png" width="325" />
    <figcaption>Меню условного форматирования</figcaption>
  </figure>
  <p id="rRdr">Форматирование с помощью градиента и правил выполняется на основе числовых значений - это может быть, как мера, которая находится в визуализации и значение которой надо отформатировать, так и любая другая мера, которая возвращает числовое значение.</p>
  <figure id="Lotc" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e9/9e/e99eb4f5-81fc-4cf8-be15-d0261f839cd8.png" width="1192" />
    <figcaption>Форматирование по умолчанию с использованием градиента</figcaption>
  </figure>
  <figure id="SoQe" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/df/94/df94115e-0af7-4119-872a-19dac46846c6.png" width="1173" />
    <figcaption>Форматирование с использованием правил на основе другой меры</figcaption>
  </figure>
  <blockquote id="n4lb"><em>Если в правилах вы задаёте числовые границы, а не процентные, то, чтобы указать нижнюю и верхнюю границу, просто очистите числовое значение в соответствующих полях (выделены синим на скриншоте), вместо указания заведомо меньших/больших значений.</em></blockquote>
  <p id="lZ5l">При использовании же третьего способа - &quot;Значение поля&quot;, необходимо выбрать столбец или меру, которые возвращают текстовое обозначение цвета: название цвета на английском (<em>Red, Green, Blue и так далее</em>), шестнадцатеричный код или HEX (<em>#000000, #FFFFFF</em>), либо RGB-код (<em>0,0,0; 255,255,255</em>).</p>
  <figure id="DTMv" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ad/7f/ad7fd3bf-cd77-476e-a2f1-a2e4239c9817.png" width="1217" />
    <figcaption>Форматирование с помощью специальной меры</figcaption>
  </figure>
  <p id="YDjB">Как видите, всё достаточно просто, не зная HEX и RGB кодов с помощью обычных слов можно задать цвет при выполнении определённых условий (правил). Но использование кодировок позволяет сделать форматирование ещё более гибким:</p>
  <figure id="JlEb" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fa/08/fa08d7f2-e7a2-48a6-b9bd-c5c42a6ca94c.png" width="1208" />
    <figcaption>Форматирование на основе шестнадцатеричного кода</figcaption>
  </figure>
  <figure id="uUKg" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c1/4e/c14eeeca-3ca8-40fb-ae2b-abe2e0712716.png" width="1204" />
    <figcaption>Форматирование на основе RGB-кода</figcaption>
  </figure>
  <p id="jw0h">В том числе можно &quot;имитировать&quot; градиент, хотя мера получится более сложная:</p>
  <figure id="I0vd" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/89/94/899459a8-1b2d-4cc0-8945-7c65453b26fe.png" width="1022" />
    <figcaption>Мера динамического расчёта цвета - градиента</figcaption>
  </figure>
  <figure id="FwaR" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/80/3b/803baf8b-90cf-42b2-a7e8-82bc5e2a93d5.png" width="1207" />
    <figcaption>Форматирование на основе пользовательского градиента</figcaption>
  </figure>
  <p id="WQaG">В конце хочу сказать о некоторых ограничениях использования условного форматирования.</p>
  <p id="4EWX"><strong>Матрица</strong></p>
  <ul id="xiUC">
    <li id="3KUq">Нельзя с помощью функции форматировать заголовки строк и столбцов</li>
    <li id="fRgn">Для каждой меры необходимо задавать условное форматирование отдельно</li>
  </ul>
  <p id="f6H3">Это ограничение можно &quot;обойти&quot;, если создать единую меру с помощью вспомогательной таблицы и функции <a href="https://dax.guide/switch/" target="_blank">SWITCH</a>, но такой способ имеет свои недостатки. Подробнее в статье &quot;<a href="https://bianalysis.ru/change-measure-part-switch" target="_blank">Переключение/включение мер в визуализации. Часть 1</a>&quot;.</p>
  <p id="YnDq"><strong>Таблица</strong></p>
  <ul id="AXId">
    <li id="Sw0a">Чтобы отформатировать всю строку, надо задать условное форматирование для каждого столбца отдельно.</li>
  </ul>
  <p id="TePx"><strong>Диаграммы</strong></p>
  <ul id="xrOk">
    <li id="p2n8">Цвет, например столбцов в гистограмме, можно задать с помощью условного форматирования, если используется ТОЛЬКО ОДНА мера и НЕТ условных обозначений:</li>
  </ul>
  <figure id="IuIA" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a0/14/a0145be7-d778-4373-b1f6-6a8a84d24245.png" width="1448" />
    <figcaption>Условное форматирование столбцов в гистограмме</figcaption>
  </figure>
  <p id="ILwH">Если же используется несколько мер или столбцы разбиваются на несколько с помощью условных обозначений, то функция условного форматирования становится не доступна:</p>
  <figure id="4QCO" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1a/04/1a04c950-b733-4c9a-ad61-234cfb5803f7.png" width="874" />
    <figcaption>Отсутствие условного форматирования в гистограмме из-за условных обозначений категорий</figcaption>
  </figure>
  <p id="LjiU">А например для диаграммы с типом &quot;График&quot; в текущей версии</p>
  <figure id="VHT1" class="m_original">
    <img src="https://img3.teletype.in/files/67/42/67428ebc-e7e7-4428-9643-cb33cbf6becd.png" width="437" />
  </figure>
  <p id="B11H">Нет возможности задать условное форматирование для маркеров, но если сначала задать его в гистограмме, то оно применится к маркерам:</p>
  <figure id="xbtv" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e9/a7/e9a7061c-1e77-48f5-aae6-e24dd7c593d3.png" width="878" />
    <figcaption>Форматирование маркеров на графике</figcaption>
  </figure>
  <p id="34OC"><strong><em>Подводя итоги</em></strong>: условное форматирование очень мощный инструмент, который добавляет интерактивности и информативности в ваши отчёты. Условное форматирование можно применять в большинстве визуализаций, используя как стандартные настройки, так и создавая собственные функции, учитывая выше описанные ограничения, а также возможные изменения в поведении после обновления версии <strong>#PowerBI</strong>.</p>
  <p id="Ru6q"><a href="https://cloud.mail.ru/public/jGLN/xkoqNdVYx" target="_blank">Ссылка</a> на файл и пример визуализаций с условным форматированием.</p>
  <figure id="EsBk" class="m_column">
    <iframe src="https://app.powerbi.com/view?r=eyJrIjoiNjZmYTk2ZjUtOGE0OS00MDkzLWE4OWMtMGFiMjY5NGZmY2NiIiwidCI6IjRlMjE5ZWNhLTRkMTQtNDYxZS04ZWVkLWQxYzkzN2E4MTVjNiIsImMiOjl9&pageName=ReportSectione8c2b7032158174979ec"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/FIELD_PARAMETRS</guid><link>https://bianalysis.ru/FIELD_PARAMETRS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/FIELD_PARAMETRS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Field parameters - переключаем меры и измерения</title><pubDate>Thu, 13 Oct 2022 12:00:42 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/67/b3/67b3585d-87c3-4711-ac11-da3efee6320b.png"></media:content><category>Visualisations</category><description><![CDATA[<img src="https://img2.teletype.in/files/d7/54/d754c2c7-5142-430f-b5ac-ed313b7e4420.png"></img>У меня есть две статьи, в которых рассказывается, как создать переключение показателей в визуальных элементах с помощью SWITCH и Calculation group. В этой статье я хочу рассказать о третьем способе, который нравится мне больше предыдущих, тем более, что с его помощью можно переключать не только меры, но и измерения. Хотя и он имеет свои ограничения, но об этом позже.]]></description><content:encoded><![CDATA[
  <p id="TIaR">У меня есть две статьи, в которых рассказывается, как создать переключение показателей в визуальных элементах с помощью <a href="https://bianalysis.ru/change-measure-part-switch" target="_blank">SWITCH</a> и <a href="https://bianalysis.ru/change-measure-part-CG" target="_blank">Calculation group</a>. В этой статье я хочу рассказать о третьем способе, который нравится мне больше предыдущих, тем более, что с его помощью можно переключать не только меры, но и измерения. Хотя и он имеет свои ограничения, но об этом позже.</p>
  <h3 id="OSPx">Включение параметра</h3>
  <p id="bkGX">По состоянию на <strong><em>13-10-2022</em></strong> года функция &quot;<em>Параметры поля</em>&quot; находится в предварительном просмотре и доступна только для стандартной версии <strong>PowerBI</strong> - в <strong>PowerBI Report Server</strong> она ещё не добавлена.</p>
  <p id="oxZk">Чтобы добавить эту функцию, необходимо в <strong>PowerBI Desktop</strong>  перейти в <em>Параметры - Предварительные версии возможностей</em> и поставить соответствующую галочку:</p>
  <figure id="DfFZ" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d7/54/d754c2c7-5142-430f-b5ac-ed313b7e4420.png" width="996" />
    <figcaption>Включение функций находящихся в Preview</figcaption>
  </figure>
  <h3 id="rmTy">Переключение мер</h3>
  <p id="noxg">Работать будем всё с той же моделью данных:</p>
  <figure id="Nczk" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0f/09/0f098b62-328a-42aa-a284-f60150e16a1e.png" width="1893" />
    <figcaption>Схема модели данных</figcaption>
  </figure>
  <p id="PXAa">В модели созданы четыре меры:</p>
  <figure id="W7Io" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/19/c5/19c54264-038b-4ca3-a743-a32138f7e339.png" width="1448" />
    <figcaption>Меры используемые в модели</figcaption>
  </figure>
  <p id="5Ct3">В визуализациях будут использоваться три меры: <strong>[Продажи шт], [Кол-во заказов], [% изменения продаж]</strong>. </p>
  <p id="5Jem"><u>Цель</u> - предоставить пользователю возможность выбора просмотра какого-либо одного показателя в визуализациях.</p>
  <p id="jRFe">Для этого переходим на вкладку <em><strong>Моделирование - Создание параметра - Поля</strong></em>:</p>
  <figure id="p5j1" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b8/01/b801d62e-26e1-4943-97f1-2e5a7080213a.png" width="1325" />
    <figcaption>Как перейти к созданию параметра поля</figcaption>
  </figure>
  <p id="G5UZ">В мастере задаём имя таблицы параметров и выбираем нужные меры <u><em>в том порядке, в котором хотим чтобы они были в срезе</em></u>:</p>
  <figure id="yYgV" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6d/54/6d540dd6-7a7f-4a71-8d40-a8434f5eb155.png" width="1071" />
    <figcaption>Создание таблицы переключения мер</figcaption>
  </figure>
  <p id="ltlk">Если потребуется изменить набор мер - добавить/удалить меры, изменить порядок их отображения или задать новые отображаемые имена, то это возможно будет сделать пока <strong>ТОЛЬКО</strong> в строке формул:</p>
  <figure id="Cu9n" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5b/3f/5b3fb023-e547-44e8-9fcc-933c7078c7f9.png" width="1326" />
    <figcaption>DAX функция создания таблицы параметров поля</figcaption>
  </figure>
  <p id="clNe">Фигурные скобки {} - краткая запись создания таблицы. В круглых скобках через запятую указывается содержание строки каждого столбца. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="mFme">Цифра в третьем &quot;столбце&quot; внутри круглых скобок отвечает за порядок отображения показателей. Не важно в каком порядке строки написаны в DAX - для сортировки важно значение этих цифр.</blockquote>
  </section>
  <p id="ZhDd">То есть в данном случае создаётся таблица, состоящая из трёх столбцов и трёх строк:</p>
  <figure id="aJO0" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/48/c9/48c953c2-4615-41f1-a61c-41e9d53a0112.png" width="593" />
    <figcaption>Таблица параметров поля в Данных</figcaption>
  </figure>
  <p id="g1Om">Столбцы имеют осмысленные названия, так как таблица параметров <strong><em>создавалась с помощью мастера</em></strong>. </p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="c5dA">Без использования мастера создать таблицу параметров полей <strong>НЕЛЬЗЯ</strong> - это будет простая таблица, даже несмотря на идентичное DAX-выражение.</p>
  </section>
  <p id="zihu">Если вы не сняли в мастере галочку &quot;<strong>Добавить срез на страницу</strong>&quot;, то на странице появится соответствующий срез:</p>
  <figure id="cYMw" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0a/ca/0acacc88-e0ee-456c-9198-725df2b76184.png" width="586" />
    <figcaption>Срез для переключения/выбора мер</figcaption>
  </figure>
  <p id="uZOP">Если же случайно сняли галочку, то просто добавьте стандартный визуал - срез, а в него столбец из таблицы параметров.</p>
  <p id="r1T3">Создадим две визуализации: гистограмму и таблицу с разбивкой по месяцам, в которые вместо мер поместим столбец с показателями из таблицы параметров. А также добавим срез по годам:</p>
  <figure id="9Gbs" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ae/1a/ae1a4706-37d6-4201-8b54-2808718697d8.png" width="1167" />
    <figcaption>Визуализации с помощью параметров поля</figcaption>
  </figure>
  <p id="09jK">Как видно, пока в срезе показателей не выбрали какое-то значение - в гистограмме и в таблице показываются все три меры. И если в таблице это приемлемо, то в диаграмме, из-за разности показателей - числа и проценты, значения искажаются. Поэтому изменим тип среза на &quot;<strong><em>Единичный выбор</em></strong>&quot;:</p>
  <figure id="0sdp" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b1/0a/b10a2d53-d967-4067-b590-e2c2165b11ab.png" width="1242" />
    <figcaption>Визуализация продаж в штуках</figcaption>
  </figure>
  <figure id="JJQS" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/0d/550d0698-e6e7-4ab0-a708-3146c5214397.png" width="1199" />
    <figcaption>Визуализация процента отклонения продаж в сравнении с предыдущим месяцем</figcaption>
  </figure>
  <p id="RK18">Теперь всё работает как надо. В отличие от метода со <strong>SWITCH</strong> - нет проблем с форматами, так как передаётся мера и её форматирование. В отличии от <strong>SWITCH</strong> и <strong>Calculation group</strong> практически не требует использования <strong>DAX</strong> - основное можно сделать с помощью мастера. Тем не менее, есть небольшая ложечка дёгтя - параметр поля, который отвечает за переключение мер, <strong><em>НЕЛЬЗЯ</em></strong> поместить в строки или столбцы матрицы, чтобы изменить порядок группировки, как я это сделал в статье &quot;<a href="https://bianalysis.ru/Measures-In_Rows" target="_blank">Как показать меры в строках матрицы?</a>&quot;</p>
  <figure id="eC4T" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/37/e8/37e8b75b-0fc7-46e6-aeab-ee6d2f550930.png" width="1552" />
    <figcaption>Матрица сгруппированная по показателям</figcaption>
  </figure>
  <p id="kUNd">Поэтому ищите и выбирайте вариант, который лучше всего подходит под вашу задачу.</p>
  <h3 id="fFj2">Переключение измерений</h3>
  <p id="a8ZD">Кроме переключения мер, <strong><em>Field Parametrs</em></strong> можно использовать и для переключения измерения, по которому построена визуализация. Принцип создания параметра идентичен созданию переключателя мер:</p>
  <figure id="PKVg" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/05/41/05411658-fb68-46c6-88cf-3f8f31b505e0.png" width="1112" />
    <figcaption>Создание таблицы измерений</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oozN"><strong>Важно</strong>: в каком порядке вы добавляете поля, в таком они и будут расположены в срезе.</p>
  </section>
  <figure id="q4Hz" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/bc/ef/bcef28cf-cac4-4834-8a24-83b492b0c82f.png" width="937" />
    <figcaption>Матрица с параметром поля</figcaption>
  </figure>
  <p id="525g">Пока не выбрано ни одно измерение они будут располагаться в визуализации в виде иерархии в том порядке, который задан в третьем столбце таблицы параметров.</p>
  <p id="84oO">Как только пользователь выбирает интересующие его измерения, они добавляются в визуализацию в <strong><u>ПОРЯДКЕ ВЫБОРА</u></strong>. Например, я сначала выбрал <strong><em>CategoryName</em></strong>, а затем <strong><em>Year</em></strong>:</p>
  <figure id="E0X5" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/2c/9a2c7564-a62e-4dd6-86b8-22565f2af48b.png" width="555" />
    <figcaption>Порядок отображения измерений</figcaption>
  </figure>
  <p id="vIN7">Таким образом, конечный пользователь получает очень гибкий инструмент настройки визуализации &quot;<em>под себя</em>&quot;, без необходимости редактирования отчёта или создания различных &quot;<em>костылей</em>&quot; в виде дополнительных таблиц с динамическими измерениями или множества закладок, в которых легко запутаться.</p>
  <p id="6nNT">Но, срез, который представлен выше, имеет один &quot;<em>недостаток</em>&quot; - он содержит измерения, относящиеся к разным сущностям(<em>иерархиям</em>): <strong>даты</strong> и <strong>товары</strong>. И хотелось бы дать пользователю возможность переключаться между иерархиями одним нажатием, а не собирать каждый раз все уровни, которых может оказаться значительно больше.</p>
  <p id="njG7">Чтобы выполнить это условие, отредактируем таблицу переключения измерений, созданную с помощью мастера:</p>
  <figure id="6vmz" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0a/3f/0a3f3abf-5175-4d04-9895-2e3a26c2f134.png" width="1374" />
    <figcaption>Добавляем группировку в таблицу параметров</figcaption>
  </figure>
  <p id="V8gc">В строке функций я добавил для каждой строки таблицы ещё один столбец, который будет объединять измерения в нужные иерархии. За одно дал русские названия для измерений, которые отображаются в срезе:</p>
  <figure id="8PZI" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/ff/98/ff981c05-9cdf-4af3-9d05-f62e82be6fdf.png" width="1126" />
    <figcaption>Переключение измерений с группировкой</figcaption>
  </figure>
  <p id="01k3">То есть теперь пользователь может, как и прежде, выбирать нужные ему измерения в нужном ему порядке, либо включать целую иерархию одним нажатием. Либо мы можем оставить возможность менять только иерархии:</p>
  <figure id="s1jG" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/eb/2d/eb2d4bf7-89e9-4027-a112-b17bbfc0fa11.png" width="1118" />
    <figcaption>Переключение иерархий одним нажатием</figcaption>
  </figure>
  <p id="wwd4">В итоговый отчёт добавил страницу, где одновременно используется переключатель и мер, и иерархий.</p>
  <figure id="mihl" class="m_column">
    <iframe src="https://app.powerbi.com/view?r=eyJrIjoiYWI0N2FlZjMtYzI1Ny00YTRkLTg4YWQtYmY0MDIyMDE0YTI4IiwidCI6IjRlMjE5ZWNhLTRkMTQtNDYxZS04ZWVkLWQxYzkzN2E4MTVjNiIsImMiOjl9"></iframe>
  </figure>
  <p id="v8Tv">Файл можно скачать по <a href="https://cloud.mail.ru/public/iqHn/ZHxvSDHAx" target="_blank">ссылке</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/big-date-part4</guid><link>https://bianalysis.ru/big-date-part4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/big-date-part4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Биг дата. Часть 4.</title><pubDate>Tue, 11 Oct 2022 09:37:35 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/92/f8/92f8ec98-14ec-4c31-8c0d-64d8e5fbca1e.png"></media:content><category>DAX</category><description><![CDATA[<img src="https://img4.teletype.in/files/b9/a9/b9a9d447-84b9-4d78-a659-f9ee5d7e5c6e.png"></img>В предыдущей части мы определились с тем, что при работе с датами без календаря никуда. В этой части хочу разобрать несколько популярных вопросов при работе с датами.]]></description><content:encoded><![CDATA[
  <p id="0CKB">В предыдущей <a href="https://bianalysis.ru/big-date-part3" target="_blank">части</a> мы определились с тем, что при работе с датами без календаря никуда. В этой части хочу разобрать несколько популярных вопросов при работе с датами.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ul id="cJMm">
      <li id="OF8f"><em>Как скрыть будущие месяцы/даты?</em></li>
      <li id="Zeus"><em>Как сравнить с предыдущей неделей?</em></li>
      <li id="ZNCc"><em>Как сравнить 10 дней с предыдущими 10 днями?</em></li>
      <li id="ZzIP"><em>Как показать предыдущие N дней, недель месяцев...?</em></li>
      <li id="E91o"><em>Как сравнить произвольные периоды?</em></li>
    </ul>
  </section>
  <p id="vi9K">Воспользуемся простой моделью из предыдущей части:</p>
  <figure id="NoCU" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b9/a9/b9a9d447-84b9-4d78-a659-f9ee5d7e5c6e.png" width="1644" />
    <figcaption>Схема модели</figcaption>
  </figure>
  <h3 id="RrC5"><em>Как скрыть будущие месяцы/даты?</em></h3>
  <p id="tZGg">Прежде чем ответить на этот вопрос, создадим меру накопительного итога:</p>
  <figure id="i85I" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fa/34/fa3401bb-04c6-44ac-a72a-588c405edd66.png" width="745" />
    <figcaption>Накопительная сумма заказов</figcaption>
  </figure>
  <p id="U6Mp">Добавим созданную меру в визуализации:</p>
  <figure id="YTE1" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/09/49/09492760-4b32-4b2e-b011-680592673b2c.png" width="2175" />
    <figcaption>Значения в &quot;будущих&quot; периодах</figcaption>
  </figure>
  <p id="FSjJ">Как видите, мера показывает значения до конца года, даже в те месяцы, когда еще не было продаж. Можно пойти сложным путём - дописать меру, выполняя проверку на фактическое значение:</p>
  <figure id="CSpq" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/22/73/2273712e-0520-4072-997b-6f9e92458245.png" width="1252" />
    <figcaption>Значения в &quot;будущих&quot; периодах скрыты</figcaption>
  </figure>
  <p id="7vd3">Но более гибкий и простой способ - это создать в календаре специальный столбец &quot;завершённый период&quot;, то есть пометить все даты, которые уже прошли:</p>
  <figure id="hrlA" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/91/62/91622153-7bff-4404-8a71-36a372c7984b.png" width="665" />
    <figcaption>Столбец в Календаре &quot;Прошедший период&quot;</figcaption>
  </figure>
  <p id="9FaO">После чего данный столбец можно использовать в качестве фильтра как для всего отчёта, так и для отдельных визуализаций или мер:</p>
  <figure id="chO0" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/bd/ee/bdee1c80-5638-46dc-83d5-f6e461ce5b4a.png" width="2184" />
    <figcaption>&quot;Будущие&quot; периоды скрыты с помощью фильтра</figcaption>
  </figure>
  <h3 id="V2LQ"><em>Как сравнить с предыдущей неделей?</em></h3>
  <p id="hYci">В <strong>DAX</strong> много функций <em><strong>Time Intelligence</strong></em>, но все они работают с четырьмя стандартными измерениями: <em><strong>день, месяц, квартал, год</strong></em>. Для того чтобы работать с другими типами измерений, например - <strong><em>неделя</em></strong>, требуется написание собственных функций. Чтобы облегчить решение задачи сравнения с предыдущей неделей, добавим в календарь сквозную нумерацию недели:</p>
  <figure id="MTTA" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c3/40/c340036c-dd04-4d39-9fd1-20d2d1e89293.png" width="1057" />
    <figcaption>Столбец в Календаре &quot;Сквозная неделя&quot;</figcaption>
  </figure>
  <p id="vSxp">В выражении сначала определяем дату первого дня недели - понедельника, а затем делим на семь дней, чтобы получить целое число номера недели.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="VCiU"><em>Можно конечно для красоты пронумеровать недели от 1 до N, но не вижу в этом смысла, поэтому использую нумерацию &quot;от начала времён&quot;, то есть от первой даты, которая используется в DAX - 31/12/1899.</em></blockquote>
  </section>
  <p id="8klS">Далее остаётся написать достаточно простую меру, которая будет считать продажи за предыдущую неделю:</p>
  <figure id="Nlf1" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8e/55/8e552955-394e-4e1c-b973-af5edd4e8cdc.png" width="1441" />
    <figcaption>Мера суммы заказов за предыдущую неделю</figcaption>
  </figure>
  <p id="KeKs">Добавим полученную меру в визуализацию:</p>
  <figure id="54N0" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/ce/ce/cece0fe6-b705-4eb9-ba27-5e02de5e47dc.png" width="1261" />
    <figcaption>Сравнение недель</figcaption>
  </figure>
  <p id="6dEt">Мера отлично работает, кроме &quot;<em>пересекающихся</em>&quot; недель при смене года, когда для последней и первой недели года показывается одинаковое значение. Для решения этого вопроса прежде всего необходимо определить бизнес логику, как смотреть/сравнивать недели. Возможно, решением будет смотреть не на &quot;<em>год-неделя</em>&quot;, а также на сквозные недели. Или работать с неделями <em>ISO </em>и относить &quot;остаток&quot; недели или к последней неделе, или к первой неделе года. Если же хочется сравнивать сопоставимые по количеству дней значения, то, выше указанную меру, можно ещё немного доработать:</p>
  <figure id="Md56" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9c/2b/9c2b627e-ea3b-4392-86ea-d04869c7bb56.png" width="1423" />
    <figcaption>Мера суммы заказов за предыдущую неделю с учетом дней недели</figcaption>
  </figure>
  <figure id="Tsh4" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/10/4e/104eff4f-bbd0-484e-8696-ea3cc7d58667.png" width="1248" />
    <figcaption>Сравнение недель с учетом дней недели</figcaption>
  </figure>
  <p id="77BY">Теперь последняя и первая неделя года вполне сопоставимы с предыдущей неделей, а дополнительно мы сможем сравнивать и неделю с неделей даже выбрав определенные дни недели.</p>
  <h3 id="7dz4"><em>Как сравнить 10 дней с предыдущими 10 днями?</em></h3>
  <p id="w0Al">Схожая с предыдущей задача, но период более нестандартный - количество дней может быть любым, в том числе и неделя (семь дней), но начинающаяся с любого дня недели. Главное - это то, что пользователь выбирает произвольный период, а мера должна рассчитать значение за аналогичный по количеству дней предыдущий.</p>
  <p id="fn78">Создаём меру:</p>
  <figure id="o0uF" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/2a/162ad466-527f-44f9-b299-25bc9d36207a.png" width="1515" />
    <figcaption>Мера с простым сдвигом на N дней</figcaption>
  </figure>
  <p id="YbOZ">Проверяем в визуализации:</p>
  <figure id="QvPp" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fa/dc/fadcda0b-0f12-4edb-99d6-a28be8dd104b.png" width="1997" />
    <figcaption>Результат сравнения</figcaption>
  </figure>
  <p id="Wlt6">Рядом специально для проверки создал несвязанные таблицу и срез для проверки. Всё работает отлично, кроме того, что набор дней недели разный. </p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Bcc0">Снова и снова повторяю: сначала бизнес вопрос, который решаем, затем решение. </p>
  </section>
  <p id="L6ss">Сформулируем его следующим образом: продажи за <strong>БЛИЖАЙШИЙ </strong>аналогичный период - с таким же набором дней недели.</p>
  <p id="KJOW">Корректируем меру:</p>
  <figure id="hwZT" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f8/8c/f88cae16-f437-4fd7-810d-7f2b28d7f581.png" width="1497" />
    <figcaption>Мера аналогичного периода</figcaption>
  </figure>
  <p id="cVik">Проверяем работу меры:</p>
  <figure id="ff8s" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/19/84/1984c246-f626-4648-bf0a-7d32fb9bd29a.png" width="2280" />
    <figcaption>Проверка работы меры аналогичного периода</figcaption>
  </figure>
  <p id="GlnF">Теперь у нас полностью сопоставимые периоды, которые начинаются с одного дня недели.</p>
  <h3 id="f8PN"><em>Как показать предыдущие N дней, недель месяцев...?</em></h3>
  <p id="D2QC">Ещё один довольно часто встречающийся сценарий, когда пользователь не хочет проставлять множество галочек выбирая нужный диапазон, а хочет указать начальную или конечную точку (дату, месяц), а в визуализации чтобы отобразилось N предыдущих/следующих значений.</p>
  <p id="IkFq">Для решения этой задачи не обойтись без создания второго календаря или вспомогательных таблиц с нужными измерениями, так как, если для мер можно изменить контекст вычисления, то для измерения (оси) фильтр или есть, или его нет.</p>
  <p id="HTeW"><strong>Например</strong>: на странице установлен фильтр по <u>текущему месяцу</u>, но при этом в одной из диаграмм необходимо показать помесячную динамику с начала года:</p>
  <figure id="OII9" class="m_column">
    <img src="https://img2.teletype.in/files/da/2a/da2a27e0-ba7f-406d-951d-c3bca1bbff39.png" width="1198" />
  </figure>
  <p id="rJBi">И верхняя, и нижняя диаграммы показывают не тот результат, который ожидается. В верхней диаграмме действует фильтр из среза, оставляя только один месяц. А для нижней диаграммы взаимодействие со срезом отключено, из-за чего отображаются значения за все периоды, а не за текущий год. Это можно исправить добавив ещё один срез с фильтром по году, или задать его же в панели фильтров, но при выборе пользователем месяца другого года придётся также изменять и второй фильтр. Цель же автоматически показывать динамику по месяцам того года, месяц которого пользователь выбрал в срезе.</p>
  <p id="BF7U">Итак, создадим копию справочника &quot;<strong><em>Календарь</em></strong>&quot;:</p>
  <figure id="CngN" class="m_column">
    <img src="https://img4.teletype.in/files/ba/f5/baf56977-ff85-4a3a-a95f-39de49dbf9c2.png" width="2222" />
  </figure>
  <p id="WsCM">Заменим в диаграмме поле <strong><em>[Year-Month]</em></strong> из основного календаря на такое же поле из дубля:</p>
  <figure id="tGlP" class="m_column">
    <img src="https://img2.teletype.in/files/5f/3f/5f3f2628-c803-4194-be04-ff509df2168c.png" width="1107" />
  </figure>
  <p id="71eK">У нас по прежнему на диаграмме отображается одно значение, так как фильтр по текущему месяцу из основного календаря всё ещё действует, а значения без данных скрываются по умолчанию. Проверим:</p>
  <figure id="hjcz" class="m_column">
    <img src="https://img4.teletype.in/files/7a/c7/7ac7b56f-4730-4ff7-869f-69d7c9e846c1.png" width="1397" />
  </figure>
  <p id="WRaH">Действительно, по измерению нет ни прямых, ни кросс фильтров. Только на меру действует контекст вычисления. Чтобы решить задачу с динамикой, кроме дополнительного календаря, создадим специальную меру:</p>
  <figure id="HM2L" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/da/c5/dac542fb-5a36-4eee-9fb3-765fc6b39496.png" width="1176" />
    <figcaption>Мера для диаграммы динамики</figcaption>
  </figure>
  <p id="nAEE">Проверяем в визуализации:</p>
  <figure id="9hgL" class="m_column">
    <img src="https://img2.teletype.in/files/9c/6e/9c6ea106-91b1-435f-bf65-d15d0bcdf7e9.png" width="2386" />
  </figure>
  <figure id="2VeL" class="m_column">
    <img src="https://img4.teletype.in/files/7b/3c/7b3cdb25-6c0b-4ef5-8ad7-fb4221b7eac5.png" width="2434" />
  </figure>
  <p id="M6t8">Как видите, в зависимости от выбранного месяца меняется и динамика по году.</p>
  <h3 id="pzD1"><em>Как сравнить произвольные периоды?</em></h3>
  <p id="EIVL">Для решения данной задачи также необходимо наличие второго календаря.</p>
  <p id="jyDC">Создадим два среза, в которых будут выбраны периоды для сравнения:</p>
  <figure id="cKvS" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/48/5a/485ad7fd-e973-4227-beea-8f25141f3984.png" width="1174" />
    <figcaption>Взаимодействие двух календарей с основной мерой</figcaption>
  </figure>
  <p id="FlXU">Основная мера возвращает пустоту, так как оба календаря связаны с таблицей фактов активной связью и создают взаимоисключающий контекст вычисления - продажа не может быть одновременно и в октябре, и в апреле. Поэтому создадим специальные меры:</p>
  <figure id="Piww" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1b/3d/1b3df97f-fdfb-4769-8c50-af96675f6ac4.png" width="1447" />
    <figcaption>Меры расчёта суммы заказов по каждому из календарей</figcaption>
  </figure>
  <p id="oqtp">Результат:</p>
  <figure id="2Msn" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/61/e0618f17-d217-4bfd-89b6-ee657e647b76.png" width="1661" />
    <figcaption>Вывод значений по каждому из срезов</figcaption>
  </figure>
  <p id="DErM">Для решения данной задачи есть ещё несколько способов, но данный считаю наиболее оптимальным, так как задействуются физические связи, которые работают наиболее быстро, а созданные меры просты для понимания.</p>
  <p id="dKoa">Посмотреть отчёт можно ниже:</p>
  <figure id="pwGt" class="m_column">
    <iframe src="https://app.powerbi.com/view?r=eyJrIjoiYWRjZmU4NDQtZDU2Zi00MzUyLWIxNTktNmQzMmUzNDRlNWIwIiwidCI6IjRlMjE5ZWNhLTRkMTQtNDYxZS04ZWVkLWQxYzkzN2E4MTVjNiIsImMiOjl9"></iframe>
  </figure>
  <p id="ngaJ">А также <a href="https://cloud.mail.ru/public/s2BR/gqhojK48T" target="_blank">ссылка</a> на скачивание файла.</p>
  <p id="zJdy"><strong>PS </strong>Оставляйте комментарии с кейсами по работе с датами, которые кажутся вам интересными или у вас не получается решить. По возможности или дополню статью, или напишу новую ;-)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/CONTEXT1</guid><link>https://bianalysis.ru/CONTEXT1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/CONTEXT1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>CALCULATE, CALCULATE, CALCULATE или контекст вычисления</title><pubDate>Wed, 20 Jul 2022 12:07:37 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7f/f4/7ff4fdcf-9206-4303-97cf-74d2b0e16049.png"></media:content><category>DAX</category><description><![CDATA[<img src="https://img1.teletype.in/files/8e/a3/8ea3e0c7-6212-44fa-ad01-cd391bf2ca55.png"></img>Основа основ работы с языком DAX - это понимание работы контекстов вычисления. И, когда только начинаешь работать в PowerBI или PowerPivot, понимание концепции работы контекстов вызывает затруднения. Каждый раз, получая не тот результат, который ожидал, начинающий разработчик впадает в уныние, поэтому хочу предложить вам своё понимание определения контекста в картинках=)]]></description><content:encoded><![CDATA[
  <p id="IqHL">Основа основ работы с языком <strong>DAX</strong> - это понимание работы контекстов вычисления. И, когда только начинаешь работать в <strong>PowerBI</strong> или <strong>PowerPivot</strong>, понимание концепции работы контекстов вызывает затруднения. Каждый раз, получая не тот результат, который ожидал, начинающий разработчик впадает в уныние, поэтому хочу предложить вам своё понимание определения контекста в картинках<em>=)</em></p>
  <blockquote id="9kdz">Я сознательно хочу упростить определение контекстов, не вдаваясь в витиеватые формулировки - всё это можно легко &quot;<em>нагуглить</em>&quot; или прочитать в книгах. Также я не буду разбирать тонкости построения моделей и связей, хотя они могут влиять на создание контекста вычисления - просто возьмём за аксиому, что модель имеет схему &quot;<em>звезда</em>&quot;, все связи однонаправленные и один ко многим.</blockquote>
  <p id="VNdj">Возьмём простую модель о продажах:</p>
  <figure id="mkCt" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8e/a3/8ea3e0c7-6212-44fa-ad01-cd391bf2ca55.png" width="1893" />
    <figcaption>Схема модели данных</figcaption>
  </figure>
  <p id="J5zy">Создадим простую меру и добавим её в визуализацию &quot;Матрица&quot;:</p>
  <figure id="g8Ow" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9e/66/9e66faab-394a-4ea1-99b9-ed3d9525a365.png" width="1346" />
    <figcaption>Базовая мера Sum Orders Qty</figcaption>
  </figure>
  <p id="P1iS">Как видно на скриншоте, сейчас на меру не действуют никакие фильтры. Данное вычисление можно представить, как таблицу из одного столбца OrderQuantity с множеством значений, которые просто суммируются.</p>
  <figure id="P7Hh" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/2b/09/2b09f674-3f05-4821-b1d1-a0d6f94a1289.png" width="172" />
    <figcaption>Таблица из одного столбца для суммирования</figcaption>
  </figure>
  <p id="7ceI">Добавим на страницу срез по полу(<strong><em>Gender</em></strong>) покупателей (<strong><em>Customers</em></strong>)  - отберём только женщин:</p>
  <figure id="vVPF" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d7/c7/d7c7ecd2-6d0e-49f1-8429-eb5b78cc84c0.png" width="1329" />
    <figcaption>Визуализация с фильтром в срезе</figcaption>
  </figure>
  <p id="WGAn">Это вычисление уже можно представить как отфильтрованную таблицу из двух столбцов:</p>
  <figure id="ycQe" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ee/86/ee86441e-d0a4-47e2-a9ee-70b285c86304.png" width="272" />
    <figcaption>&quot;Виртуальная&quot; таблица с фильтром по Gender</figcaption>
  </figure>
  <p id="sL9m">Чтобы узнать: <em>Сколько покупают женщины по понедельникам?</em> - добавим в панель фильтров соответствующий фильтр:</p>
  <figure id="rn5Y" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ef/47/ef47909e-67f0-4d81-a027-31c5d635dc93.png" width="1347" />
    <figcaption>Фильтр на странице в боковой панели</figcaption>
  </figure>
  <p id="5Un7">Наша &quot;<em>виртуальная</em>&quot; таблица снова расширилась. В ней появился новый столбец - <strong><em>NameDayWeek</em></strong>, отфильтрованный по <em>понедельнику</em>:</p>
  <figure id="W6bw" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6c/5c/6c5c1c4c-842f-48e6-8845-91c4b149aac0.png" width="448" />
    <figcaption>&quot;Виртуальная&quot; таблица по Gender и NameDayWeek</figcaption>
  </figure>
  <p id="6gaH">А товары из каких категорий женщины покупают по понедельникам?</p>
  <figure id="4kNl" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/cd/11/cd11a971-5b9a-4ad0-bb87-c0633f1a12b9.png" width="1000" />
    <figcaption>Добавляем измерение в строки</figcaption>
  </figure>
  <p id="atzV">Названия категорий (<strong><em>CategoryName</em></strong>) мы добавили в строки матрицы - это <em>НЕ</em> является фильтром для <em><strong>ДАННОГО ВИЗУАЛЬНОГО</strong></em> элемента (если выбрать строку в этом визуальном элементе, то значение строки измерения будет фильтром для других визуальных элементов), <strong><em>НО</em></strong> является фильтром для меры.</p>
  <p id="7P1H">Каждая ячейка визуального элемента вычисляется <strong>НЕЗАВИСИМО</strong> от других в <strong>СВОЁМ</strong> контексте вычисления.</p>
  <p id="Fag9">В соответствии с выше описанным правилом для ячейки со значением <strong><em>4271 </em></strong>фильтром является <strong><em>CategoryName</em></strong>=&quot;<em>Accessories</em>&quot;, а в &quot;<em>виртуальную</em>&quot; таблицу добавляется ещё один столбец:</p>
  <p id="fzCE"> </p>
  <figure id="gvI8" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ae/e5/aee5e2a1-dab1-424d-9a8a-69288731728c.png" width="598" />
    <figcaption>&quot;Виртуальная&quot; таблица по Gender, NameDayWeek, CategoryName</figcaption>
  </figure>
  <p id="9s0F">Точно также фильтром для меры будут и значения измерений, которые находятся в столбцах визуального элемента:</p>
  <figure id="beKS" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6a/d3/6ad3f72f-aff5-44e4-b786-9b1a69b4e245.png" width="1215" />
    <figcaption>Добавляем в столбцы матрицы измерение Calendar[Year]</figcaption>
  </figure>
  <figure id="x0Hj" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/c1/16c1d3f0-c0dd-47bb-9de9-3b6b34358d46.png" width="673" />
    <figcaption>&quot;Виртуальная&quot; таблица отфильтрована по году</figcaption>
  </figure>
  <p id="8Fri">Таким образом можно сформулировать, что перед вычислением меры, сначала вычисляются все внешние фильтры, которые складываются в единый фильтр, как логическое &quot;<strong>И</strong>&quot;: <strong><em>И</em></strong> женщины, <strong><em>И</em></strong> понедельник, <strong><em>И</em></strong> Accessories, <strong><em>И</em></strong> 2017 - после чего происходит агрегирование оставшихся значений. Если все выше полученные фильтры интерпретировать в код, то мы получили бы следующую меру:</p>
  <figure id="WWvC" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/89/68/8968c3c0-0197-4c4e-8ea7-ca0c602c72d7.png" width="1162" />
    <figcaption>Интерпретация контекста в виде меры</figcaption>
  </figure>
  <p id="3uqV">Но, помимо внешних, в мере могут быть и внутренние фильтры, которые, в зависимости от синтаксиса, либо дополняют внешний контекст, либо изменяют его.</p>
  <p id="2oFT">Создадим новую меру и поместим её в такую же матрицу:</p>
  <figure id="jM73" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7d/f8/7df86a48-e2a8-49dc-b9e2-8deb8c021996.png" width="1561" />
    <figcaption>Визуализация меры с внутренним фильтром</figcaption>
  </figure>
  <p id="hrQt">В нижней матрице теперь отображаются продажи женщинам по понедельникам только товаров красного цвета. А код интерпретации выглядит следующим образом:</p>
  <figure id="yRXE" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6c/c7/6cc725f4-68e7-4776-9df1-0c5acac461b6.png" width="1505" />
    <figcaption>Интерпретация контекста в виде меры с внутренним фильтром</figcaption>
  </figure>
  <p id="eaWA">В интерпретации кода теперь присутствуют две функции <a href="https://docs.microsoft.com/ru-ru/dax/calculate-function-dax" target="_blank">CALCULATE</a>. Это ещё одна аксиома: в мере <strong>ВСЕГДА</strong> по умолчанию есть функция <a href="https://docs.microsoft.com/ru-ru/dax/calculate-function-dax" target="_blank">CALCULATE</a>. Также видно, что в нижней матрице исчезла категория <em>Clothing</em>, в которой не было продаж товаров красного цвета.</p>
  <p id="kgFy">Добавим в обе матрицы в строки измерение <strong><em>ProductColor</em></strong>:</p>
  <figure id="GWiJ" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c0/cf/c0cf2b26-0580-4175-86c4-c38ab6d2cd84.png" width="2067" />
    <figcaption>Матрицы по категориям и цветам</figcaption>
  </figure>
  <p id="6W4c">В матрице справа в строках с названиями цветов все значения одинаковые в рамках года, плюс добавились строки с цветами, по которым не было продаж. Это произошло потому, что в мере <strong>[SOQ Red]</strong> мы принудительно изменили контекст вычисления. Краткая запись (&quot;<em>синтаксический сахар</em>&quot;) - <strong><em>&#x27;Products&#x27;[ProductColor]=&quot;Red&quot;</em></strong>, на самом деле интерпретируется как <strong><em>FILTER(ALL(&#x27;Products&#x27;[ProductColor]), &#x27;Products&#x27;[ProductColor]=&quot;Red&quot;)</em></strong>. То есть, после того, как были вычислены все внешние фильтры, во внутреннем мы говорим: верни <strong><em>ВСЕ </em></strong>цвета - <strong><em>ALL(&#x27;Products&#x27;[ProductColor])</em></strong> и выбери из них красный - <strong><em>&#x27;Products&#x27;[ProductColor]=&quot;Red&quot;</em></strong>. И как раз здесь многие начинающие запинаются, полагаясь на интуицию и применяя функцию <a href="https://docs.microsoft.com/ru-ru/dax/filter-function-dax" target="_blank">FILTER</a> следующим образом:</p>
  <figure id="K2R7" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/eb/62/eb6239ba-6dc6-466a-9a9a-8a7fe4b54f65.png" width="2710" />
    <figcaption>&quot;Странно&quot; работающая мера</figcaption>
  </figure>
  <p id="oqNM">Забывая или не зная, что к внутренним аргументам фильтра также сначала применяются все внешние фильтры, а только потом внутренние. Например: к таблице <strong><em>Products </em></strong>применяются внешние фильтры по <strong><em>CategoryName</em></strong>=&quot;<em>Accessories</em>&quot; и <strong><em>ProductColor</em></strong>=&quot;<em>Black</em>&quot;, а потом в полученной таблице мы просим найти <em>красный </em>цвет, но, естественно, нельзя найти красный там, где только чёрный. Если же применить функцию <a href="https://docs.microsoft.com/ru-ru/dax/all-function-dax" target="_blank">ALL</a> ко всей таблице <strong><em>Products</em></strong>, то мы потеряем фильтр по <strong><em>CategoryName </em></strong>и также получим неверный результат.</p>
  <p id="eehD">Предлагаю вам в следующий раз, когда запутаетесь в контекстах вычисления, также, как и я, попробовать представить &quot;<em>виртуальную</em>&quot; таблицу, в которую вы по шагам добавляете по одному столбцу(фильтру), выбирая в них нужные значения, соблюдая порядок вычисления - от внешних к внутренним. Успехов!</p>
  <p id="Sjoq">P.S. Пока я писал эту статья Марко Руссо и Альберто Феррари выпустили отличное видео про контексты, со схожей, как мне кажется, концепцией объяснения:</p>
  <figure id="owo8" class="m_column">
    <iframe src="https://www.youtube.com/embed/OJFCKg7wDLc?autoplay=0&loop=0&mute=0"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/TABLE-ONE-AND-MANY</guid><link>https://bianalysis.ru/TABLE-ONE-AND-MANY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/TABLE-ONE-AND-MANY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>PowerBI - &quot;одна таблица&quot; vs &quot;звезда&quot;</title><pubDate>Tue, 05 Jul 2022 10:55:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e3/d2/e3d20424-620f-4798-b3d4-6fffd6604649.png"></media:content><category>DAX</category><description><![CDATA[<img src="https://img1.teletype.in/files/c0/d9/c0d9c0c6-a77e-4e58-b670-d6bcf32d9645.png"></img>В #PowerBI все вычисления зависят от контекста, в котором выполняются. И чтобы контекстом было просто управлять, требуется создать &quot;правильную&quot; модель данных.]]></description><content:encoded><![CDATA[
  <p id="IRLO">В <strong>#PowerBI</strong> все вычисления зависят от контекста, в котором выполняются. И чтобы контекстом было просто управлять, требуется создать &quot;правильную&quot; модель данных.</p>
  <p id="GTOs">Исходя из собственного опыта и опыта множества других разработчиков, наиболее оптимальной является модель схемы &quot;<em>звезда</em>&quot;, когда в центре у вас находится таблица фактов, а вокруг таблицы измерений (справочников), которые фильтруют факты.</p>
  <figure id="ABa4" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c0/d9/c0d9c0c6-a77e-4e58-b670-d6bcf32d9645.png" width="1901" />
    <figcaption>Схема &quot;звезда&quot;</figcaption>
  </figure>
  <p id="ONEC">Но начинающие аналитики и разработчики, особенно те, кто идёт из <em>Excel</em>, любят работать с одной таблицей, в которой &quot;<em>всё есть</em>&quot;.</p>
  <figure id="73Eu" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d0/1f/d01fcf63-5d86-4eb9-8561-f0907d8e7278.png" width="1949" />
    <figcaption>Единая таблица</figcaption>
  </figure>
  <p id="VQ4e">Как правило, источником данных таких таблиц служит учетная система, из которой ИТ-служба настроила выгрузку &quot;<em>по максимуму</em>&quot;, чтобы их беспокоили как можно меньше.</p>
  <p id="5I5s">Предлагаю на примере двух наиболее популярных задач в аналитике разобрать, почему схема со справочниками лучше, чем схема из одной таблицы:</p>
  <ol id="nAhD">
    <li id="rIs7">Как сравнить продажи текущего года с предыдущим?</li>
    <li id="bNKz">Как посчитать долю продаж?</li>
  </ol>
  <p id="9Qc0">А в конце бонусом расскажу: как &quot;<em>спрятать</em>&quot; в фильтрах то, что не продавалось?</p>
  <h3 id="t1R5">Как сравнить продажи текущего года с предыдущим</h3>
  <p id="WqVq">Для начала создадим две базовые меры для каждой модели:</p>
  <figure id="DPvF" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a3/5f/a35f1833-f73a-4283-ab8a-8309614b9963.png" width="1060" />
    <figcaption>Базовые меры продаж</figcaption>
  </figure>
  <p id="QiID">Создадим одинаковые визуализации в виде таблиц по <strong><em>Subcategory</em></strong></p>
  <figure id="618P" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4c/76/4c76195f-e0ff-40e4-afb4-c6a92ef94673.png" width="1740" />
    <figcaption>Продажи по Subcategory</figcaption>
  </figure>
  <p id="ejAY">Далее создаём меры, которые вычисляют сумму продаж за предыдущий год, для этого воспользуемся функцией <a href="https://docs.microsoft.com/ru-ru/dax/dateadd-function-dax" target="_blank">DATEADD</a>:</p>
  <figure id="Zi1Q" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0a/6c/0a6cdbc6-4357-4702-a098-91173bb638b4.png" width="1520" />
    <figcaption>Меры продаж за предыдущий год</figcaption>
  </figure>
  <p id="eiRS">Добавляем созданные меры в визуализации и в таблице с данными из схемы &quot;<em>одна таблица</em>&quot; получаем ошибку:</p>
  <figure id="dTOI" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a8/3b/a83bd592-bea3-42fe-a3eb-da337dce822e.png" width="1853" />
    <figcaption>Визуализация продаж за предыдущий год</figcaption>
  </figure>
  <p id="zdnP">Прочитаем подробности:</p>
  <figure id="rrHL" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7d/c1/7dc1770c-63b6-4f46-bffa-1014b7f3cd1c.png" width="922" />
    <figcaption>Содержание ошибки вычисления</figcaption>
  </figure>
  <p id="qQIm">Для новичка такое сообщение мало что скажет, поэтому требуется пояснение:</p>
  <p id="92rP">Функции <a href="https://docs.microsoft.com/ru-ru/dax/dateadd-function-dax" target="_blank">DATEADD</a> необходимо сдвинуть каждую дату в текущем контексте (2016 год) на один год назад, но если в 2016 году для какой-то <strong><em>Subcategory</em></strong> не было продажи, хотя бы один день, то функция не будет знать откуда сдвигать данные.</p>
  <p id="AIqQ">При использовании схемы &quot;<em>звезда</em>&quot; в модели присутствует справочник <strong><em>Calendar</em></strong>, который содержит все даты каждого года, а так как все связи однонаправленные,  то есть таблица <strong><em>Products</em></strong> фильтрует таблицу <strong><em>Sales</em></strong>, но не фильтрует <strong><em>Calendar</em></strong> и наоборот, то такой ошибки не возникает.</p>
  <h3 id="7Qco">Как посчитать долю продаж</h3>
  <p id="sAaZ">Для расчёта доли продаж <strong><em>Subcategory </em></strong>в <strong><em>Category </em></strong>применим функцию <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a>:</p>
  <figure id="5qSL" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/03/03/03034d42-114b-4a6f-98a5-e4cf0f5fac2e.png" width="1112" />
    <figcaption>Меры продаж по категории</figcaption>
  </figure>
  <p id="zENf">Визуализируем данные:</p>
  <figure id="c9MK" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5e/c8/5ec87522-0fad-45af-bf13-774fc333c9ed.png" width="2174" />
    <figcaption>Продажи по категории</figcaption>
  </figure>
  <p id="dvpP">Как видно на скриншоте выше, результат для схемы &quot;<em>одна таблица</em>&quot; получился некорректным. Так как первый аргумент функции <a href="https://dax.guide/allexcept/" target="_blank">ALLEXCEPT</a> это таблица, с которой удаляются все фильтры, кроме указанных после запятой. То есть в том числе был удалён и фильтр по году, таким образом мера показывает продажи категории за все года. Для схемы &quot;<em>звезда</em>&quot; всё считается верно, так как фильтр сбрасывается только с таблицы <strong><em>Products</em></strong>, а фильтр по году из таблицы <strong><em>Calendar </em></strong>по прежнему действует.</p>
  <p id="OsYV">Исправим меру для схемы &quot;<em>одна таблица</em>&quot;:</p>
  <figure id="4yuf" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/47/60/476008ed-a005-450b-bfaf-04aa882c8469.png" width="1434" />
    <figcaption>Продажи по категории с учетом года</figcaption>
  </figure>
  <p id="DAcA">Проверяем:</p>
  <figure id="pYjr" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/35/54/35543809-ed6c-4122-96e9-7943fe619aba.png" width="2159" />
    <figcaption>Исправленные продажи по категории</figcaption>
  </figure>
  <p id="2p6B">Теперь всё верно, но если появится ещё какой-то фильтр, например по месяцу, то придётся вновь исправлять меру или создавать новую, которая будет учитывать новый фильтр, что усложняет разработку и поддержание отчёта в сравнении со схемой &quot;<em>звезда</em>&quot;.</p>
  <h3 id="SsoA">Бонус: как &quot;спрятать&quot; в фильтрах то, что не продавалось</h3>
  <p id="pM28">Одним из аргументов сторонников схемы &quot;<em>одна таблица</em>&quot; является: необходимо, чтобы срезы показывали только те значения, которые есть в данных в текущем контексте, а не весь справочник.</p>
  <figure id="EkTv" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/15/3d/153d9942-f3e7-49be-afd0-961828bc3fe5.png" width="953" />
    <figcaption>Срез по Subcategory</figcaption>
  </figure>
  <p id="bnZB">Слева на скриншоте срез из схемы &quot;<em>одна таблица</em>&quot; - он содержит только те <strong><em>Subcategory</em></strong>, по которым были продажи. Справа срез из схемы &quot;<em>звезда</em>&quot; - это полный справочник товаров, даже те, по которым не было продаж. Если вам не нужна такая информация, то эти товары лучше фильтровать <strong>ДО</strong> загрузки в модель. Но &quot;<em>лишние</em>&quot; <strong><em>Subcategory</em></strong> будут оставаться, если мы будем в отчёте схемы &quot;<em>звезда</em>&quot; фильтровать не только товары.</p>
  <figure id="dKEQ" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fc/b6/fcb63654-14c7-4cda-b133-1b5eb12c7dfc.png" width="946" />
    <figcaption>Срез по Subcategory за 2015 год</figcaption>
  </figure>
  <p id="fN2L">В срезе схемы &quot;<em>одна таблица</em>&quot; осталось только две <strong><em>Subcategory</em></strong>, а в срезе схемы &quot;<em>звезда</em>&quot; по прежнему все значения. &quot;Неопытные&quot; разработчики начинают изменять типы связей с односторонней на двунаправленные:</p>
  <figure id="Mv4a" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0c/f8/0cf8941f-55fd-43c5-a95f-4b4d8a7c1390.png" width="1837" />
    <figcaption>Создание двунаправленных связей</figcaption>
  </figure>
  <p id="0OEZ">С одной стороны - это решает проблему:</p>
  <figure id="CVkt" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/70/85/70853235-f5c5-4126-af66-17a9a22b3634.png" width="954" />
    <figcaption>Срез схемы &quot;звезда&quot; с двунаправленной связью</figcaption>
  </figure>
  <p id="3UCT">А с другой, это приводит к усложнению действий контекста - из-за того, что теперь фильтры по связям распространяются на все таблицы, проходя через таблицу <strong><em>Sales</em></strong>. Например, перестала работать мера, которая считает сумму продаж за предыдущий год:</p>
  <figure id="s3x3" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/91/ed/91ed3909-90b7-43a5-b120-be6be5f9261b.png" width="1888" />
    <figcaption>Нерабочая мера продаж за предыдущий год</figcaption>
  </figure>
  <p id="6tJc">Правильным решением будет фильтровать срез по значению меры. Можно воспользоваться любой базовой мерой или создать простую меру, которая считает строки в таблице фактов:</p>
  <figure id="RV8z" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7a/b7/7ab714cb-05f7-4232-b5ce-16e8dabd7cc5.png" width="734" />
    <figcaption>Подсчёт строк в таблице фактов</figcaption>
  </figure>
  <p id="NG9E">Далее помещаем меру в фильтры визуального элемента и выбираем: &quot;не является пустым&quot; - Применить фильтр</p>
  <figure id="qGxt" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b5/40/b540100e-dfed-4b77-9bc9-62b6b4accf4a.png" width="1214" />
    <figcaption>Фильтр среза по мере</figcaption>
  </figure>
  <p id="osZG">Для наглядности добавил срезы по <strong><em>Subcategory</em></strong>, для которых отключено взаимодействие по срезу год, но для среза схемы &quot;<em>звезда</em>&quot; также действует фильтр по мере.</p>
  <p id="nR1V">Надеюсь эти три небольших примера сравнения убедили вас, что схема &quot;<em>звезда</em>&quot; лучшее решение относительно схемы &quot;<em>одна таблица</em>&quot;. </p>
  <p id="ZQQp">Если вы хотите более подробно изучить моделирование данных в <strong>#PowerBI</strong>, то рекомендую сайт(<a href="https://www.sqlbi.com/" target="_blank">sqlbi.com</a>) и книги <em>Альберто Феррари</em> и <em>Марко Руссо</em>. Кстати, почти все они переведены на русский язык замечательным переводчиком <a href="https://t.me/alexanderginko_books" target="_blank">Александром Гинько.</a></p>
  <p id="3Riu"><a href="https://cloud.mail.ru/public/EUaT/Nj65499Mw" target="_blank">Ссылка</a> на файл-пример для скачивания.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://bianalysis.ru/AW_GOODS_IN_CHECK_TOP</guid><link>https://bianalysis.ru/AW_GOODS_IN_CHECK_TOP?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell</link><comments>https://bianalysis.ru/AW_GOODS_IN_CHECK_TOP?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=iashell#comments</comments><dc:creator>iashell</dc:creator><title>Как показать TopN сопутствующих товаров?</title><pubDate>Mon, 04 Jul 2022 15:04:52 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/79/15/7915f462-1e5f-41aa-bedc-cd801ec1feee.png"></media:content><category>DAX</category><description><![CDATA[<img src="https://img3.teletype.in/files/e3/cb/e3cb4fc3-bdb3-4dd8-8532-24a1de5850d2.png"></img>В продолжение предыдущей статьи про средний чек родился следующий вопрос:]]></description><content:encoded><![CDATA[
  <p id="ewIH">В продолжение предыдущей <a href="https://bianalysis.ru/AV_CHECK" target="_blank">статьи</a> про средний чек родился следующий вопрос:</p>
  <p id="KEm0">А как показать те товары, которые покупают с выбранным и отобрать из них лучшие?</p>
  <p id="5IVR">Чтобы ответить на этот вопрос, необходимо доработать файл из предыдущей статьи (<em>ссылка на файл как всегда в конце статьи</em>).</p>
  <p id="QvDD">Сначала создадим дубликат таблицы продуктов, с помощью которой будем выбирать товар:</p>
  <figure id="FhVX" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e3/cb/e3cb4fc3-bdb3-4dd8-8532-24a1de5850d2.png" width="1023" />
    <figcaption>Вспомогательная таблица Products Double</figcaption>
  </figure>
  <p id="so5A">Полученную таблицу соединим <strong>НЕАКТИВНОЙ</strong> связью с таблицей продаж <strong><em>Sales</em></strong>:</p>
  <figure id="Bx6h" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8b/99/8b9990ff-f8f1-4bf0-8a14-3ce85d52c764.png" width="870" />
    <figcaption>Создание связи &#x27;Products Double -&gt; Sales</figcaption>
  </figure>
  <p id="5Get">Далее создаём меру:</p>
  <figure id="eOEs" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/89/31/893152ad-22c6-4d0f-99ce-3a14b3d08a18.png" width="997" />
    <figcaption>Мера суммы продаж по сопутствующим товарам в чеке</figcaption>
  </figure>
  <p id="11xK">С помощью функции <a href="https://docs.microsoft.com/ru-ru/dax/removefilters-function-dax" target="_blank">REMOVEFILTERS</a> удаляются <strong>ВСЕ</strong> фильтры, которые применяются к таблице <strong><em>Sales </em></strong>из таблицы <strong><em>Products</em></strong>. А с помощью функции <a href="https://docs.microsoft.com/ru-ru/dax/userelationship-function-dax" target="_blank">USERELATIONSHIP</a> активируется связь со вспомогательной таблицей. Таким образом с помощью <a href="https://docs.microsoft.com/ru-ru/dax/values-function-dax" target="_blank">VALUES</a> мы получаем список заказов, в которых был выбранный товар. Этот список в свою очередь выступает дополнительным фильтром для меры <strong>[Sum Orders Qty]</strong>.</p>
  <p id="ls1I">А затем визуализируем:</p>
  <figure id="BfBZ" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/57/fe/57fe08fc-2ffe-443d-ae83-46b7000c5a6f.png" width="1331" />
    <figcaption>Результат вычисления меры</figcaption>
  </figure>
  <p id="gULf">В срез добавлен столбец с наименованием из дубликата таблицы товаров <strong><em>&#x27;Products Double&#x27;</em></strong>, а в таблице столбец с наименованием из основной таблицы <strong><em>Products</em></strong>.</p>
  <p id="RO4E">Обратите внимание, что на первом месте по сумме заказов в таблице расположился выбранный в срезе товар, чтобы <em>исключить</em> его из этого списка модифицируем меру:</p>
  <figure id="VExr" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6b/e6/6be617f5-da7f-4ff8-8bfa-2776c114bb05.png" width="1156" />
    <figcaption>Модифицированная мера продаж сопутствующих товаров</figcaption>
  </figure>
  <p id="ibgJ">С помощью функций <a href="https://docs.microsoft.com/ru-ru/dax/keepfilters-function-dax" target="_blank">KEEPFILTERS</a> и <a href="https://docs.microsoft.com/ru-ru/dax/not-function-dax" target="_blank">NOT</a> &quot;<em>исключаем</em>&quot; выбранный товар.</p>
  <blockquote id="J9n0">Напоминаю: каждый аргумент фильтра внутри <a href="https://docs.microsoft.com/ru-ru/dax/calculate-function-dax" target="_blank">CALCULATE</a> оценивается отдельно, согласно контекста вычисления.</blockquote>
  <p id="0WsR">Для наглядности вывел обе меры рядом:</p>
  <figure id="2FJH" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c4/b7/c4b792ec-8d4e-4343-8144-a61c8820474f.png" width="1620" />
    <figcaption>Сравнение вычисления двух мер</figcaption>
  </figure>
  <p id="KL8V">Чтобы ограничить выборку сопутствующих товаров, воспользуемся встроенным функционалом фильтрации визуальных элементов.</p>
  <blockquote id="CtAg"><em>Про более гибкий способ отобразить TopN чего-либо можно прочитать <a href="https://bianalysis.ru/TopN-goods" target="_blank">здесь</a></em></blockquote>
  <figure id="qSyG" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/06/8d/068d631f-8bec-4dea-a8a0-c9766c354027.png" width="1601" />
    <figcaption>ТОП-5 лучших по сумме заказов</figcaption>
  </figure>
  <p id="Foo7">В зависимости от задачи следует выбирать соответствующую меру. Я выбрал отобрать пять лучших по сумме заказов <strong>[Sum Orders Qty]</strong>, но у меня в таблице осталось только <em>четыре </em>наименования. Почему? Всё просто - мера <strong>[Sum Orders Qty]</strong> считает <strong><em>ВСЕ </em></strong>заказы, а не только те, в которых есть выбранный товар. Таким образом можно сделать вывод, что один из популярных товаров <strong><em>НЕ </em></strong>продаётся вместе с выбранным товаром.</p>
  <p id="atIK">Давайте изменим визуализацию, заменив меру в фильтре:</p>
  <figure id="E2bg" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1b/1c/1b1c2849-738e-44c9-9be7-c90d22921159.png" width="1598" />
    <figcaption>ТОП-5 сопутствующих товаров</figcaption>
  </figure>
  <p id="LCiM">Как видим, два списка значительно различаются между собой и можно сделать вывод, что выбранный товар не так часто продаётся с товарами, которые входят в <em>ТОП-5</em> по всем заказам, чем с другими товарами.</p>
  <p id="MyPg">Отчёт, чтобы пощелкать и <a href="https://cloud.mail.ru/public/ZeG5/cxsUccRoW" target="_blank">ссылка</a> на файл</p>
  <figure id="uUjO" class="m_column">
    <iframe src="https://app.powerbi.com/view?r=eyJrIjoiOGI3YWMyY2QtZDFiYy00YWI4LWFjZWQtNDY5YWVlZmE4MDdhIiwidCI6IjRlMjE5ZWNhLTRkMTQtNDYxZS04ZWVkLWQxYzkzN2E4MTVjNiIsImMiOjl9"></iframe>
  </figure>

]]></content:encoded></item></channel></rss>