【问题标题】:How to prevent RANKX from duplicating when I add columns添加列时如何防止RANKX重复
【发布时间】:2019-09-17 20:01:17
【问题描述】:

我有一个包含以下列的表格:

stockcode、commercial、inhouse、sales、GP、qty、ticket_number

商品和内部是不可透视的指标,无论股票代码是商品还是非商品,以及它是内部产品还是非内部产品

stockcode 列具有我想要排名的唯一值,但我希望它在切片器中是动态的,因此我用切片器值“销售额、GP、数量、售出次数”制作了一个表格。我还创建了衡量销售额、GP 和数量的措施,也将ticket_number 计算为购买项目的次数。

我创建了以下代码来对这些度量进行排名:

RANK STOCKCODE =
IF (
    SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 1,
    RANKX ( ALL ( Lines[stockcode] ), [ITEM TOTAL] ),
    IF (
        SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 2,
        RANKX ( ALL ( Lines[stockcode] ), [ITEM GP $] ),
        IF (
            SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 4,
            RANKX ( ALL ( Lines[stockcode] ), [QTY BOUGHT] ),
            IF (
                SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 5,
                RANKX ( ALL ( Lines[stockcode] ), [TIMES ITEM WAS BOUGHT] ),
                RANKX ( ALLNOBLANKROW ( Lines[stockcode] ), [ITEM TOTAL] )
            )
        )
    )
)

然后我使用 stockcodes 列创建我的表,并将度量与排名度量一起放入,效果很好……直到我放入商品和内部/非内部列(股票代码独有) .出于某种原因,我无法理解 Power Bi 用于执行此操作的逻辑,RANKX 在为股票代码创建排名并进行复制时会考虑商品/非商品和内部/非内部组合之间的每种变化.

我尝试制作一个单独的股票代码表,删除重复项并将查找列应用于股票代码,以确保没有我不知道的重复组合,但它仍然重复。密集排名不起作用。跳过不起作用。我不知道如何解决这个问题。

尝试排除商品和内部列,考虑过滤器、hasones 值、全部选中、重新使用 all() 并仅参考表格。

试过了,但它只是将每个股票代码排名为 rank = 1:

RANK STOCKCODE =
IF (
    SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 1,
    RANKX ( ALLEXCEPT ( Lines, Lines[ISCOMMODITY], Lines[ISTAMCO] ), [ITEM TOTAL] ),
    IF (
        SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 2,
        RANKX ( ALLEXCEPT ( Lines, Lines[ISCOMMODITY], Lines[ISTAMCO] ), [ITEM GP $] ),
        IF (
            SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 4,
            RANKX ( ALLEXCEPT ( Lines, Lines[ISCOMMODITY], Lines[ISTAMCO] ), [QTY BOUGHT] ),
            IF (
                SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] ) = 5,
                RANKX (
                    ALLEXCEPT ( Lines, Lines[ISCOMMODITY], Lines[ISTAMCO] ),
                    [TIMES ITEM WAS BOUGHT]
                ),
                RANKX ( ALLEXCEPT ( Lines, Lines[ISCOMMODITY], Lines[ISTAMCO] ), [ITEM TOTAL] )
            )
        )
    )
)

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    很高兴您找到了解决方案!通过摆脱嵌套的 if,利用 VAR 功能并改用开关,您可能会获得一点性能和一点可读性:

    RANK STOCKCODE =
    VAR Selection =
        SELECTEDVALUE ( TOPNITEMS[TOPNVALUES] )
    RETURN
        SWITCH (
            Selection,
            1, RANKX ( ALL ( STOCKCODE[stockcode] ), [ITEM TOTAL] ),
            2, RANKX ( ALL ( STOCKCODE[stockcode] ), [ITEM GP $] ),
            4, RANKX ( ALL ( STOCKCODE[stockcode] ), [QTY BOUGHT] ),
            5, RANKX ( ALL ( STOCKCODE[stockcode] ), [TIMES ITEM WAS BOUGHT] ),
            RANKX ( ALLNOBLANKROW ( STOCKCODE[stockcode] ), [ITEM TOTAL] )
        )
    

    这样你的 dax 只需要计算一次选定的值。基本上与您在帖子中的内容相同,但根据模型的大小,您可能会注意到性能的提升,而且它肯定会更漂亮一些;)

    【讨论】:

      【解决方案2】:

      好吧,我想通了。

      我创建了一个包含所有唯一股票代码值的新表,并将其链接到我的表,其中包含值(销售额、gp 等)。

      然后我转到我的等级代码并将带有值的表格更改为带有唯一股票代码的表格。

      RANK STOCKCODE = 
      
      IF(SELECTEDVALUE(TOPNITEMS[TOPNVALUES])=1,RANKX(all(STOCKCODE[stockcode]),
      [ITEM TOTAL]),
      IF(SELECTEDVALUE(TOPNITEMS[TOPNVALUES])=2,RANKX(ALL(STOCKCODE[stockcode]),
      [ITEM GP $]),
      IF(SELECTEDVALUE(TOPNITEMS[TOPNVALUES])=4,RANKX(ALL(STOCKCODE[stockcode]),
      [QTY BOUGHT]),
      IF(SELECTEDVALUE(TOPNITEMS[TOPNVALUES])=5,RANKX(ALL(STOCKCODE[stockcode]),
      [TIMES ITEM WAS BOUGHT]),
      RANKX(ALLNOBLANKROW(STOCKCODE[stockcode]),
      [ITEM TOTAL])))))
      

      然后在“可视化”窗格中,我确定了正在使用的 UNIQUE 表中的股票代码,而不是带有值的表中的股票代码。

      最后,我做了查找度量以放入我的可视化模型中,而不是直接使用表中的列和所有值。 DAX 如下所示:

      COMMODITY = `LOOKUPVALUE(Lines[ISCOMMODITY],Lines[stockcode],SELECTEDVALUE(STOCKCODE[stockcode]))`
      

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2017-07-25
        • 2021-06-16
        • 2021-11-03
        • 1970-01-01
        • 2012-06-01
        相关资源
        最近更新 更多