Всем здравствуйте. Встал такой вопрос: можно ли создать меру, которая бы считала количество пустых ячеек в строке сводной таблицы, по аналогии с функцией СЧЁТ В примере моделька и формулой сделан столбец, который хочу получить в виде меры. Фактически нужно посчитать количество месяцев без продаж для каждой номенклатуры с учетом фильтров сводной таблицы. Если это сильно заморочно, то хотя бы пните в какую сторону копать.
Доброе время суток. Смотрю, коллега, вы до асимметричных сводных добрались? Задача не столь тривиальна. Через ISFILTERED, HASONEFILTER определяете, что вы находитесь в итогах. Лучше сделать дополнительный вычисляемый столбец в таблице, в котом для каждой даты вычисляете первый день месяца, тогда по DISTINCTCOUNT(Таблица[ПервыйДеньМесяца]) получите число месяцев продаж по точке. По CALCULATE(DISTINCTCOUNT(Таблица[ПервыйДеньМесяца]); ALL(Таблица)) получите сколько всего в таблице месяцев продаж. Осталось найти разницу. Может быть засада, если одновременно у всех точек были месяцы без продаж, тогда можно воспользоваться DATEDIFF между крайними датами столбца ПервыйДеньМесяца. Аналогично и по точкам месяца, только считаете разницу наименования всех точек таблицы и продававших в этом месяце. Успехов.
Изменено: Андрей VG - 09.08.2017 20:04:58(Поправил маленько, пока Зеленский не раскритиковал.)
Я правильно понял, что в подсчете месяцев CALCULATE вычисляет различные значения месяцев в столбце [Дата (Месяц)] функцией DISTINCTCOUNT, а через ALLEXCEPT вы убираете влияние столбца [Дата (Месяц)] на контекст строки?
А какой функцией убирать влияние на контекст фильтра? С этим вроде разобрался, это функция FILTER.
И еще не понятно: в справке MS указано, что DISTINCTCOUNT подсчитывает различные числовые значения в столбце,
Цитата
The DISTINCTCOUNT function counts the number of different cells in a column of numbers.
вы же ему скармливаете столбец с текстом. Это я что-то не так понимаю или MS что-то скрывает?
PooHkrd написал: ALLEXCEPT вы убираете влияние столбца [Дата (Месяц)] на контекст строки?
наоборот, ALLEXCEPT говорит о том, что надо убрать все фильтры, кроме указанного. DISTINCTCOUNT - если честно, уже не помню. чтобы читал справку по этой функции. Но, если не изменяет память, то в первых версиях PowerPivot этой функции не было и использовали сочетание DISTINCT - COUNTROWS, потом добавили DISTINCTCOUNT и может тогда она считала только по числам, но не буду врать - не помню уже.
В Power Pivot для ячеек без значений необходимо выводить 0. Это должно быть реализовано именно с помощью DAX формул (а не с помощью "для пустых ячеек показывать 0), так как формула с результатом 0 будет частью более сложной формулы. Я пытаюсь это реализовать через countrows + 0, но, к сожалению, пока не удается. В приложенном файле желтым выделены ячейки, по которым необходимо отображать 0, а не пусто.
Впервые с таким сетом данных сталкиваюсь. Получается, что если в изначальной таблице нет строк подходящих под фильтры, которые задает сводная таблица, то РР в принципе не обсчитывает такие ячейки и не выдает для них результат, даже если написать формулу
Код
Мера:= 1
Поиск по буржуйским сайтам ничего не дал. Ждем корифеев. Если все же предлагать хоть какие-то рабочие варианты, то можно тащить источник данных через PQ и добавлять в него недостающие строки с null в столбце [value]. Тогда уже +0 в формуле будет работать (но подозреваю что он даже и не будет нужен. З.Ы. Есть подозрение что проблема решаема также путем добавления в модель данных справочника номенклатур и таблицы дат, связать все это дело. Тогда в качестве измерений в сводную нужно будет добавлять строки из справочника, столбцы из календаря, а меры рассчитывать уже из таблицы фактов. Всегда так делаю, наверное потому и с такой проблемой ранее не сталкивался. Вообще добавление столбцов из таблицы фактов в качестве измерений в сводной - это, по моему опыту, всегда зло.
PooHkrd написал: Есть подозрение что проблема решаема также путем добавления в модель данных справочника номенклатур и таблицы дат, связать все это дело. Тогда в качестве измерений в сводную нужно будет добавлять строки из справочника, столбцы из календаря, а меры рассчитывать уже из таблицы фактов.
Все верно. Именно в таком сочетании будет работать IF() Пояснение: Без справочников для модели просто не существует контекста 2016-продукт1, поэтому даже в сводной не просто пусто, а абсолютное ничто для меры, если так можно выразиться)))
StepanWolkoff написал: Все верно. Именно в таком сочетании будет работать IF()
Только пользователи DAX как огня боятся таблиц-измерений А если столкнулись, то сразу же вопросы - а как в Excel сделать bideretional связь как в Power BI? А проблема уже не раз обсуждалась и подобное решение проблемы предлагалось.
Модель данных из моего примера - это искусственно созданный маленький пример. На самом деле, реальный датасет огромный, с кучей измерений и фактов, источник - SQL процедура с сложным запросом из множества таблиц . Получается, единственный выход - менять SQL код, добавляя измерения без фактов?
Знаю, что сложно без реального примера SQL запроса, но есть ли какие-то приемы добавления измерений без фактов в сложный SQL, например оперируя только результирующим select? Не хочется шерстить весь SQL запрос, меняя join-ы, запрос написан не мной, боюсь навредить.
Ну так подключайтесь к SQL не через РР, а через PQ. Делаете 2 запроса - один формирует из таблицы фактов справочник, второй вытягивает собственно саму таблицу фактов. Календарь генерится средствами РР автоматически. Налаживайте связи и вперед.
OksanaB, предлагаю вам хорошо подумать, сформулировать свой вопрос и создать новую тему, а то как-то странно вы тут продолжили, вобще по другой теме.
Цитата
OksanaB написал: так как формула с результатом 0 будет частью более сложной формулы.
из этого следует, что на самом деле вам нужно совсем другое нежели вы говорите в начале
Цитата
OksanaB написал: В Power Pivot для ячеек без значений необходимо выводить 0.
Если вам нужно посчитать нули, то даже на вашей модели это можно сделать, если уж так хочется:
Код
Количество пустых:=var cj=SUMMARIZE(CROSSJOIN(VALUES('Таблица1'[product]);VALUES('Таблица1'[year]));[product];[year]; "summa";SUM('Таблица1'[value]))
return
COUNTROWS(FILTER(cj;ISBLANK([summa])))
Т.е. через CROSSJOIN получаем все возможные сочетания year-product, потом вычисляем для каждой строки value, и потом считаем пустые. НО!!! Вы говорите
Цитата
OksanaB написал: Модель данных из моего примера - это искусственно созданный маленький пример. На самом деле, реальный датасет огромный, с кучей измерений и фактов
А при таком подходе результат CROSSJOIN может оказаться очень большим и будет ооочень медленно считаться, а если не хватит ресурсов то и вобще не посчитать)) Так что еще раз предлагаю: хорошо подумайте, сформулируйте вопрос. создайте новую тему и приложите пример максимально близкий к тому что у вас в реальности.
OksanaB написал: Знаю, что сложно без реального примера SQL запроса, но есть ли какие-то приемы добавления измерений без фактов в сложный SQL, например оперируя только результирующим select? Не хочется шерстить весь SQL запрос, меняя join-ы, запрос написан не мной, боюсь навредить.
Зачем такие сложности? Пусть ваш мегасложный и мегакрутой запрос выгружает данные как и сейчас и это будет таблица фактов. Добавьте еще один запрос select * from таблица[products], если надо еще какое-то измерение, то еще один запрос с select к этому измерению. У вас в модель данные грузятся на прямую из SQL или сначала выгружаются в Excel или csv?
StepanWolkoff, да, согласна, создам пример, максимально приближенный к реальности.
Но поскольку существует еще другая проблема , требующая решения - выводить в сводной таблице, созданной через Power Pivot, измерения без фактов (что в обычных сводных таблицах решается нажатием галочки "Отображать пустые элементы"), то, чувствую, все равно придется копать в сторону PQ (то, что предлагает PooHkrd) или изменениям на стороне SQL запроса.
Не показываете ссылки на параллельное размещение вопроса.
Цитата
Публикуя один и тот же вопрос в разных форумах и на дружественных сайтах вы заставляете сразу нескольких людей параллельно думать над вашей задачей и обесцениваете усилия тех, кто даст ответ вторым-третьим и т.д.
OksanaB, предлагаю вам оформить корректный пример и создать новую тему с адекватным названием. Все же здесь ваш вопрос это оффтоп. Заодно в той теме и ссылки на кросс-пост оформите. А здесь дайте ссылку на новую тему, чтобы все заинтересованные могли продолжать уже в ней.
OksanaB написал: ссылки где предлагалось реальное решение?
С этим сложнее, проще пример сделать.
Цитата
OksanaB написал: в модель данные грузятся на прямую из SQL
Аналогично можно грузить и данные для измерений. Просто просмотрите код запроса, какие таблицы и столбцы формируют те столбцы, которые вы используете как источник строк и столбцов в сводной. Вот их уникальные значения и нужно выдернуть с сервера.
StepanWolkoff написал: Без справочников для модели просто не существует контекста 2016-продукт1, поэтому даже в сводной не просто пусто, а абсолютное ничто для меры, если так можно выразиться
Это называется AUTOEXISTS. Если столбцы из одной таблицы, то в рассмотрение берутся только имеющиеся сочетания значений этих столбцов, а не CROSSJOIN этих значений. Соответственно, несуществующие сочетания действительно даже не рассматриваются. Если же столбцы из разных таблиц, то тогда формируется условно CROSSJOIN, на который уже действуют ухищрения типа "+0" или "выводить 0".