DAX: вычислять, только если в наборе данных присутствуют данные за все годы - PullRequest
0 голосов
/ 05 мая 2020

У меня есть набор данных, содержащий данные прогноза продаж по годам за 5 лет.

В каждой строке указаны заказчик, тип позиции, год, количество и цена продажи.

Не все клиенты покупают все продукты за все годы.

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

Пример сокращенной таблицы выглядит так:

Customer    Product Year    Qty Price
CustA       ProdA   2020    50  100
CustA       ProdA   2021    50  100
CustA       ProdA   2022    50  100
CustA       ProdB   2020    50  100
CustA       ProdB   2021    50  100
CustA       ProdC   2021    50  100
CustA       ProdC   2022    50  100
CustA       ProdD   2020    50  100
CustA       ProdD   2021    50  100
CustA       ProdD   2022    50  100
CustB       ProdA   2021    50  100
CustB       ProdA   2022    50  100
CustB       ProdC   2020    50  100
CustB       ProdC   2021    50  100
CustB       ProdC   2022    50  100
CustB       ProdD   2020    50  100
CustB       ProdD   2021    0   100
CustB       ProdD   2022    50  100

И транспонировано, выглядит так:

Customer    Product     2020    2021    2022
CustA       ProdA       50      50      50
CustA       ProdB       50      50
CustA       ProdC               50      50
CustA       ProdD       50      50      50
CustB       ProdA               50      50
CustB       ProdC       50      50      50
CustB       ProdD       50      0       50

Итак, для этого примера я бы хотел выполнить расчеты или указать строки, в которых есть продажи за все три года. Я пытался использовать следующую формулу, которую я бы сравнил с максимальным количеством лет в наборе, чтобы пометить строку как действительную или нет, но это убивает Excel. В исходной таблице всего 32 000 строк.

=CALCULATE(
      DISTINCTCOUNT(DataTable[Year]), 
      filter(DataTable, DataTable[Product] = EARLIER(DataTable[Product])), 
      filter(DataTable, DataTable[Customer] = EARLIER(DataTable[Customer])), 
      filter(DataTable, DataTable[Qty] > 0)
    )

Есть ли лучший подход, который я мог бы использовать для этого?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Как насчет этого?

ProductList =
VAR AllYears = DISTINCTCOUNT ( 'DataTable'[Year] )
VAR Summary =
    SUMMARIZE (
        'DataTable',
        'DataTable'[Product],
        "YearsPurchased", CALCULATE (
            DISTINCTCOUNT ( 'DataTable'[Year] ),
           'DataTable'[Qty] > 0
        )
    )
RETURN
    SELECTCOLUMNS (
        FILTER ( Summary, [YearsPurchased] = AllYears ),
        "Product", [Product]
    )

Summary агрегирует на уровне Product и смотрит, сколько разных лет у него было с ненулевым количеством. Затем вы просто фильтруете те, которые соответствуют AllYears, и берете столбец Product.


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

Изменить: Чтобы получить YearsPurchased в качестве вычисляемого столбца, вам просто нужна часть этого:

YearsPurchased =
CALCULATE (
    DISTINCTCOUNT ( 'DataTable'[Year] ),
    FILTER ( ALLEXCEPT ( 'DataTable', 'DataTable'[Product] ), 'DataTable'[Qty] > 0 )
)
0 голосов
/ 05 мая 2020

Для этого не нужно использовать dax. Создайте матричную визуализацию с использованием необходимых данных. Это должно выглядеть так:

enter image description here

Не забудьте отключить параметры общего и промежуточного итогов.

Это другое решение с использованием нового столбца поэтому вам не нужно расширять матрицу.

Column = COMBINEVALUES( " ", Table[Customer], Table[Product] )

enter image description here

Надеюсь, это вам поможет.

...