我正在寻找一种方法(使用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”列,以使表中的每一行都为“ Null”。结果集。
谢谢,
马特
答案 0 :(得分:3)
这可以通过DAX中的PATH() and PATHITEMREVERSE()函数来完成。
要获取每一行的完整路径:
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()
函数将返回错误。
答案 1 :(得分:1)
此后,您必须进行数据透视,但是您可以按照DAX中的以下几行创建此形式的柱状形式:
web
这假设您已向原始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
。
如果将null转换为空字符串,则此方法在矩阵视觉效果很好,其中Sibling
在行上,Name
在列上。 (在不替换空值的情况下,视觉效果将不会显示最后一行或最后一列,因为它们都是空白。)