Я ищу способ (используя SQL или DAX) самостоятельно присоединиться к таблице, пока она не обнулится.
Пример, вероятно, самый простой способ описать проблему:
Предположим, у нас есть справочная таблица вроде этой:
Name Next Youngest Sibling
Aaron Nicole
Nicole Bobby
Из этого я хотел бы создать соединение, которое выравнивает эту таблицу следующим образом:
Name Next Sibling Next X 2 Sibling Next x 3 Sibling
Aaron Nicole Bobby Null
Nicole Bobby Null Null
Bobby Null Null Null
Очевидно, это можно сделать с помощью 3 ручных соединений, но я ищу способ сделать это динамическим, чтобы он создавал столько столбцов «Next x X», сколько ему нужно, чтобы «обнулить» каждую строку в наборе результатов.
Спасибо,
Мэтт
Позже вам придется выполнить поворот самостоятельно, но вы можете создать его столбчатую форму в следующих строках в DAX:
Nulled = ADDCOLUMNS(
CROSSJOIN(
VALUES(Siblings[Name]),
SELECTCOLUMNS(GENERATESERIES(1, COUNT(Siblings[Name])), "Nth", [Value])),
"Sibling", LOOKUPVALUE(Siblings[Name],
Siblings[Rank], [Nth] + RANK.EQ([Name], Siblings[Name], ASC)),
"Column", IF([Nth] = 1, "Next", "Next x " & [Nth]) & " Sibling")
Предполагается, что вы добавили столбец Rank
в исходную таблицу Siblings
.
Ключевым моментом здесь является перекрестное соединение, чтобы получить желаемый размер таблицы, а затем определить Sibling
.
Если вы конвертируете нули в пустые строки, это прекрасно работает в матричном визуале, где Name
находится в строках, а Column
- в столбцах. (Без замены нулей визуальный элемент не будет отображать ни последнюю строку, ни последний столбец, поскольку все они являются пустыми.)
Вот это да. Вы действительно мастер DAX!
Это можно сделать с помощью функций PATH () и PATHITEMREVERSE () в DAX.
Чтобы получить полный путь для каждой строки:
All Names = PATH(People[Name], People[Next Youngest Sibling])
Это будет строка, разделенная вертикальной чертой (|
); и в этом случае он находится в обратном порядке, потому что концепция братьев и сестер противоположна концепции родитель-потомок по умолчанию.
Чтобы получить Next Sibling
и Next X 2 Sibling
:
Next Sibling = PATHITEMREVERSE(People[All Names], 2)
Next X 2 Sibling = PATHITEMREVERSE(People[All Names], 3)
Где поиск будет выполняться справа от строки пути.
Ограничение: конечный узел также должен присутствовать в таблице, следовательно, дополнительная строка Bobby, Bobby
; в противном случае функция PATH()
вернет ошибку.
Есть ли у вас верхняя граница количества братьев и сестер? Один вопрос - действительно ли он (действительно) должен быть в таком формате вывода? Это будет нетривиально, потому что вам понадобится динамический стержень. Если что-то вроде {Имя, брат, сестра, возрастной рейтинг} сработает, вам нужен гораздо более простой запрос.