Я - опытный парень SQL ... новый для DAX. Я пытаюсь создать DAX-запрос для создания скользящего среднего.
Внутренние расчеты инвентаря немного сложны, но , надеюсь, не обязательно для обсуждения.Вложенный запрос DAX
Input будет, как:
month inventory
1 5
2 9
3 7
4 11
Желаемый результат:
reportMonth average3MthInventory
3 7
4 9
То есть, перечень сред должны представляться в течение месяца 3, задн среднем месяцев 1,2, 3 = (5 + 9 + 7)/3 = 7 ... месяц 4 будет средним значением за месяцы 2,3,4.
До сих пор, запрос использует резюмировать производить промежуточную таблицу ежемесячных инвентарных номеров т.е.
evaluate
filter(
crossJoin(
summarize(
...
, reportMonths[month] -- group by
, "inventory", count(widgets[widgetID])
) -- end summarize
) -- end crossJoin
) -- end filter
Это создает промежуточную таблицу:
reportMonths[month] actualMonths[month] [inventory] ... plus some other columns
3 1 5
3 2 9
3 3 7
4 2 9
4 3 7
4 4 11
Это точно так, как ожидалось. Из этого следует учесть в среднем инвентарь за отчетный месяц.
На данный момент, я обернул запрос выше в другом резюмировать к вычислить окончательные цифры:
evaluate
summarize(
filter(
crossJoin(
summarize(
...
, reportMonths[month] -- group by
, "inventory", count(widgets[widgetID])
) -- end summarize
) -- end crossJoin
) -- end filter
, "month", reportMonths[month]
, "avgInventory", average([inventory])
) -- summarize
Но это возвращает сообщение об ошибке: «Не удается идентифицировать таблицу, содержащую [инвентаризации] столбец «.
Невозможно найти способ ссылки на промежуточную таблицу. Должен быть другой способ структурировать это.
Любые идеи оценили.
Редактировать в ответ на Алехандро Zuleta:
Алехандро,
Спасибо за быстрый ответ. Дальнейшая информация ...
История инвентаризации основана на «списках» продуктов. Гранулярность даты - ежемесячно, и каждый листинг имеет месяц onMarket и offMarket (месяцы нумеруются последовательно). списки имеют другие атрибуты TypeID, Areaid и т.д.
listingID onMarketMonth offMarketMonth ... other attribs - typeID, etc.
101 1 2
103 1 6
105 2 2
106 2
109 2 3
117 3 4
123 3
124 3 9
Inventory вычисляется на основе onMarket и offMarket месяцев например в месяц 3 инвентаря - количество листингов, в котором месяц onMarket < = 3 и offMarket month is> 3 (или пустой). Исходя из приведенной выше таблице, инвентарь будет выглядеть следующим образом:
инвентарь
month inventory note: listings in inventory
1 2 101, 103
2 3 103, 106, 109
3 5 103, 106, 117, 123, 124
4 4 103, 106, 123, 124
...
Необходимо иметь возможность сообщать о ряде значений, например. для диаграммы, а также скользящих средних. Пример кода для серии месяцев с 2 по 6 для конкретного типа и области будет следующим:
evaluate
summarize(
filter(
crossJoin(
calculateTable(listings, listings[typeID] = 47)
, filter(reportMonths, [month] >= 2 && [month] <= 6)
) -- crossjoin
, listings[onMarketMonth] <= reportMonths[month] && (or(listings[offMarketMonth] > reportMonths[month], isBlank(listings[offMarketMonth]))) -- join condition
) -- filter the join
, reportMonths[month]
, "inventory",count(listings[listingID])
) -- summarize
Это работает. Повесить ... как расширить это, чтобы создать скользящий средний запас.
Обновление Выяснено. Ключ был переключением с подвел до groupBy (https://msdn.microsoft.com/en-us/library/mt163693.aspx).
Обратите внимание на пример кода (ниже), что [Общие продажи] определены/рассчитаны в GroupBy в VAR, а затем указаны в запросе ниже (в GroupBy в Оценке). Когда я попробовал что-то подобное с помощью Summarize, получил ошибку.
DEFINE
VAR SalesByCountryAndCategory =
GROUPBY (
Sales,
Geography[Country],
Product[Category],
“Total Sales”, SUMX(CURRENTGROUP(), Sales[Price] * Sales[Qty])
)
Evaluate GROUPBY (
SalesByCountryAndCategory,
Geography[Country],
“Max Sales”, MAXX(CURRENTGROUP(), [Total Sales])
)
Спасибо Алехандро. Попасть туда.Пожалуйста, см. Править на оригинальное сообщение. –
@PaulEvans - это ваша таблица ввода, созданная с использованием последнего выражения? Также какую версию SSAS вы используете? –
Использование 2016 с последними обновлениями. Последнее выражение не используется нигде в процессе прямо сейчас. –