2016-11-08 6 views
0

Я - опытный парень 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]) 
) 

ответ

0

Вы можете создать меру для получения желаемого среднего значения с помощью функции EARLIER.

average3MthInventory = 
IF (
    MAX ([month]) > 2, 
    CALCULATE (
     AVERAGE (Inventory[inventory]), 
     FILTER (
      ALL (Inventory[month]), 
      COUNTROWS (
       FILTER (
        Inventory, 
        EARLIER ([month]) 
         >= [month] - 2 
         && [month] >= EARLIER (Inventory[month]) 
       ) 
      ) 
     ) 
    ), 
    BLANK() 
) 

Затем просто используйте эту меру в сводной таблице или визуализации Power BI.

enter image description here

Однако, если вам нужно получить таблицу вы можете использовать это выражение:

EVALUATE 
FILTER (
    SUMMARIZE (
     ADDCOLUMNS (
      ADDCOLUMNS (
       Inventory, 
       "MinMonth", IF (Inventory[month] > 2, Inventory[month] - 2, BLANK()) 
      ), 
      "average3MthInventory", IF (
       ISBLANK ([MinMonth]), 
       BLANK(), 
       CALCULATE (
        AVERAGE (Inventory[inventory]), 
        FILTER (
         Inventory, 
         [month] >= EARLIER ([MinMonth]) 
          && [month] <= EARLIER ([month]) 
        ) 
       ) 
      ) 
     ), 
     [month], 
     [average3MthInventory] 
    ), 
    NOT ISBLANK ([average3MthInventory]) 
) 

Предполагая, что ваш входной таблицы называется Inventory вы должны получить это:

enter image description here

ОБНОВЛЕНИЕ:

Таблица инвентаризации, созданная вашим выражением DAX, не может быть обработана для расчета среднего значения за последние три месяца. К счастью, вы используете SSAS 2016, который поддерживает вычисленные таблицы.

Расчетные таблицы - это полностью управляемые таблицы, созданные выражением DAX, в отношении одной или нескольких таблиц в вашей модели.

Вам необходимо создать расчетную таблицу, используя выражение DAX, которое производит инвентарь в месяц. Я рекомендую вам назвать его Inventory в соответствии с запросом DAX, который я разместил выше, чтобы вычислить требуемое среднее значение.

Проверьте эти ресурсы о создании расчетной таблицы:

RESOURCE 1
RESOURCE 2

После расчетная таблица создается использовать мой запрос, и вы увидите, в среднем за последние три месяца.

Я протестировал этот подход, используя рассчитанные столбцы, и он работает.

Сообщите мне, если это поможет вам.

+0

Спасибо Алехандро. Попасть туда.Пожалуйста, см. Править на оригинальное сообщение. –

+0

@PaulEvans - это ваша таблица ввода, созданная с использованием последнего выражения? Также какую версию SSAS вы используете? –

+0

Использование 2016 с последними обновлениями. Последнее выражение не используется нигде в процессе прямо сейчас. –