Это довольно сложно, так как я не могу придумать, как использовать значения динамически вычисляемой таблицы в качестве поля в визуале. (Вы можете создавать вычисляемые таблицы, но они не реагируют на срезы. Вы также можете создавать динамически вычисляемые таблицы внутри меры, но меры не возвращают таблицы, только отдельные значения.)
Единственный способ сделать это - создать таблицу для каждой возможной комбинации продуктов. Однако, если у вас есть N продуктов, то в этой таблице есть 2 N строк, и это быстро взрывается.
Вот расчетная таблица, которая выведет все комбинации:
Table2 =
VAR N = DISTINCTCOUNT(Table1[product])
VAR Products = SUMMARIZE(Table1,
Table1[product],
"Rank",
RANKX(ALL(Table1),
Table1[product],
MAX(Table1[product]),
ASC,
Dense
)
)
VAR Bits = SELECTCOLUMNS(GENERATESERIES(1, N), "Bit", [Value])
VAR BinaryString =
ADDCOLUMNS(
GENERATESERIES(1, 2^N),
"Binary",
CONCATENATEX(
Bits,
MOD( TRUNC( [Value] / POWER(2, [Bit]-1) ), 2)
,,[Bit]
,DESC
)
)
RETURN
ADDCOLUMNS(
BinaryString,
"Combination",
CONCATENATEX(Products, IF(MID([Binary],[Rank],1) = "1", [product], ""), "")
)
Затем добавьте вычисляемый столбец, чтобы получить версию с разделителями:
Delimited =
VAR Length = LEN(Table2[Combination])
RETURN
CONCATENATEX(
GENERATESERIES(1,Length),
MID(Table2[Combination], [Value], 1),
","
)
Если вы поместите Delimited
раздел «Строки» в визуал матрицы и следующий показатель в раздел «Значения»:
customers =
VAR Summary = SUMMARIZE(Table1,
Table1[customer_id],
"ProductList",
CONCATENATEX(VALUES(Table1[product]), Table1[product], ","))
RETURN SUMX(Summary, IF([ProductList] = MAX(Table2[Delimited]), 1, 0))
И отфильтровывая любые 0 клиентских ценностей, вы должны получить что-то вроде этого:
Так что да ... не очень хорошее решение, особенно когда N становится большим, но, может быть, лучше, чем ничего?
Edit:
Чтобы работать с более длинными названиями продуктов, давайте использовать разделитель в конкатенации Combination
:
CONCATENATEX(Products, IF(MID([Binary],[Rank],1) = "1", [product], ""), ",")
(обратите внимание на изменение ""
на ","
в конце.)
А затем переписать вычисленный столбец Delimited
, чтобы удалить лишние запятые.
Delimited =
VAR RemoveMultipleCommas =
SUBSTITUTE(
SUBSTITUTE(
SUBSTITUTE(
SUBSTITUTE(Table2[Combination], ",,", ","),
",,", ","),
",,", ","),
",,", ",")
VAR LeftComma = (LEFT(Table2[Combination]) = ",")
VAR RightComma = (RIGHT(Table2[Combination]) = ",")
RETURN
IF(RemoveMultipleCommas <> ",",
MID(RemoveMultipleCommas,
1 + LeftComma,
LEN(RemoveMultipleCommas) - RightComma - LeftComma
), "")
Наконец, давайте немного изменим customers
, чтобы он мог подытогить.
customers =
VAR Summary = SUMMARIZE(Table1,
Table1[customer_id],
"ProductList",
CONCATENATEX(VALUES(Table1[product]), Table1[product], ","))
VAR CustomerCount = SUMX(Summary, IF([ProductList] = MAX(Table2[Delimited]), 1, 0))
VAR Total = IF(ISFILTERED(Table2[Delimited]), CustomerCount, COUNTROWS(Summary))
RETURN IF(Total = 0, BLANK(), Total)
Переменная Total
дает общее количество клиентов для итога. Обратите внимание, что я также установил, чтобы нули возвращались пустыми, чтобы вам не нужно было фильтровать нули (это автоматически скроет эти строки).