DAX 公式显示不重复的值并计算它们

DAX formula to show not repeated values and count them

我有一个 table,其中 "CODE" 列的值如下:

FTRA2
BRB92
RBRB4
XYZ
SXM4
RBRB4
NLDR
XYZ
FTRA2
POEU
FTRA2

我目前有这个公式

="[ Unique values " & DISTINCTCOUNT(MyTable[CODE]) & "] 
" & CONCATENATEX(DISTINCT(MyTable[CODE]), MyTable[CODE] ,", ")

输出这个:

[ Unique values 7 ]
FTRA2, BRB92, RBRB4, XYZ, SXM4, NLDR, POEU

我想显示所有唯一值及其计数(字符串 "XYZ" 除外),下面显示有多少个 "XYZ" 值,如下所示:

[ Unique values 6 ]
FTRA2, BRB92, RBRB4, SXM4, NLDR, POEU

[2 XYZ values]

在这种情况下,有 2 个 "XYZ" 值,但也可以是零 XYZ 值。

我正在使用 Excel 2016.

我该怎么做?提前致谢。

更新1

我在尝试 Joe 的解决方案时遇到了这个错误。

更新2

乔,我能够像这样修改你的第一部分:

= VAR ExcludeValue = "XYZ"
RETURN
    CALCULATE(
        "[ Unique values " & DISTINCTCOUNT(MyTable[Code]) & " ]"
        " & CONCATENATEX(DISTINCT(MyTable[Code]), [Code], ", ")
        , MyTable[Code] <> ExcludeValue
    )

但是当我添加第二部分时它说这个错误

This formula is invalid or incomplete: 'Calculation error in
measure 'MyTable[Code]: The function COUNT takes an argument 
that evaluates to numbers or dates and cannot work with values 
of type String.'.   

我还删除了 UNICHAR,因为它在 Excel 上不起作用。

更新3

Joe 的解决方案在我将 COUNT(MyTable[Code]) 修改为 COUNTROWS(MyTable)

后可以正常工作

最终的解决方案如下所示。

=VAR ExcludeValue = "XYZ"
RETURN
    CALCULATE(
        "
        [ Unique values " & DISTINCTCOUNT(MyTable[Code]) & " ]
        " & CONCATENATEX(DISTINCT(MyTable[Code]), [Code], ", ")
        , MyTable[Code] <> ExcludeValue
    )  & "

" & CALCULATE(
        "[" & COUNTROWS(MyTable) & " " & ExcludeValue & " values]"
        , MyTable[Code] = ExcludeValue
    ) & "
"   

更新4

当没有 "XYZ" 值时不打印任何内容适用于您的 IF() 添加。当根本没有价值时,我试图按照你的逻辑做同样的事情。我加了一个 IF() 计算 MyTable[Code] <> ExcludeValue 是否大于 0,如果为真则执行原始计算,如果不是 BLANK() 但不起作用。

CountLabel = 
VAR ExcludeValue = "XYZ"
RETURN
IF(
    CALCULATE(COUNTROWS(MyTable), MyTable[Code] <> ExcludeValue) > 0, 
    CALCULATE(
        "[ Unique values " & DISTINCTCOUNT(MyTable[Code]) & " ]"
        & UNICHAR(10) & 
        CONCATENATEX(DISTINCT(MyTable[Code]), [Code], ", ")
        , MyTable[Code] <> ExcludeValue
    ),
    BLANK()
    )
    & IF(
        CALCULATE(COUNTROWS(MyTable), MyTable[Code] = ExcludeValue) > 0,
        UNICHAR(10) & " " & UNICHAR(10) & 
        CALCULATE(
            "[" & COUNTROWS(MyTable) & " " & ExcludeValue & " values]"
            , MyTable[Code] = ExcludeValue
        ),
        BLANK()
    )

最终更新

这是按预期工作的最终公式。感谢 Joe 在这种情况下的帮助。

=VAR ExcludeValue = "XYZ"
RETURN
    IF(
        CALCULATE(DISTINCTCOUNT(MyTable[Code]), MyTable[Code] <> ExcludeValue) > 0 && 
        MyTable[Count of Code]>0,
        CALCULATE(
            "
            [ Unique values " & DISTINCTCOUNT(MyTable[Code]) & " ]
            " & CONCATENATEX(DISTINCT(MyTable[Code]), [Code], ", ")
            , MyTable[Code] <> ExcludeValue
        ),
        BLANK()
    )
    &
    IF(
        CALCULATE(DISTINCTCOUNT(MyTable[Code]), MyTable[Code] <> ExcludeValue) > 0 &&
            CALCULATE(COUNTROWS(MyTable), MyTable[Code] = ExcludeValue) > 0,
        " 

        " &
        BLANK()
    )
    & IF(
        CALCULATE(COUNTROWS(MyTable), MyTable[Code] = ExcludeValue) > 0,
        CALCULATE(
            "[" & COUNTROWS(MyTable) & " " & ExcludeValue & " values]"
            , MyTable[Code] = ExcludeValue
        ),
        BLANK()
    ) & "
"

更新: - 根据 OP 的反馈,将我的公式从使用 COUNT 更改为 COUNTROWS

更新 2: - 将 IF 语句添加到公式中以排除 0.

时的排除计数

更新 3: - 将 IF 语句添加到公式中以在 0.

时排除非重复计数

我会说我在 Power BI 中创建了这个解决方案,但是 Excel 2016 在 DAX 方面应该具有相同的功能(稍作调整)。

我用你的公式创建了一个度量,并用一个 CALCULATE 语句简单地包装了每一部分(不同的计数和重复的计数),该语句用于将你的 MyTable 过滤到你关心的代码.

我为 "XYZ" 值使用了一个变量,以防需要更改。现在您只需在一个地方(在公式的开头)更改它,公式的其余部分将反映该更改。

我还使用 UNICHAR(10) 添加换行符而不是计算公式中的新行。

使用 IF 语句...

  • 第一个将检查不等于指定值的项目的不同计数是否大于零。如果没有,它不会显示任何内容。
  • 第二个将检查指定值的非重复计数和行计数是否都大于零。如果是,它将添加换行符。
  • 第三个将检查等于指定值的项目的行数是否大于零。如果没有,它不会显示任何内容。

最终公式为:

CountLabel = 
VAR ExcludeValue = "XYZ"
RETURN
    IF(
        CALCULATE(DISTINCTCOUNT(MyTable[Code]), MyTable[Code] <> ExcludeValue) > 0,
        CALCULATE(
            "[ Unique values " & DISTINCTCOUNT(MyTable[Code]) & " ]"
            & UNICHAR(10) & 
            CONCATENATEX(DISTINCT(MyTable[Code]), [Code], ", ")
            , MyTable[Code] <> ExcludeValue
        ),
        BLANK()
    )
    &
    IF(
        CALCULATE(DISTINCTCOUNT(MyTable[Code]), MyTable[Code] <> ExcludeValue) > 0 &&
            CALCULATE(COUNTROWS(MyTable), MyTable[Code] = ExcludeValue) > 0,
        UNICHAR(10) & " " & UNICHAR(10),
        BLANK()
    )
    & IF(
        CALCULATE(COUNTROWS(MyTable), MyTable[Code] = ExcludeValue) > 0,
        CALCULATE(
            "[" & COUNTROWS(MyTable) & " " & ExcludeValue & " values]"
            , MyTable[Code] = ExcludeValue
        ),
        BLANK()
    )

结果如下(同样是在 Power BI 中)。

使用 COUNTROWS 而不是 CALCULATE 来过滤唯一项的 table,想出了一些相似但略有不同的东西。另外,我刚刚开始学习 DAX,所以不知道这是否是一种 "proper" 的方法,但它似乎有效。

Measure = 
VAR Exclusion = "XYZ"
RETURN
"[ Unique values " & COUNTROWS(FILTER(DISTINCT(MyTable[CODE]), [CODE] <> Exclusion)) & "] 
" & CONCATENATEX(FILTER(DISTINCT(MyTable[CODE]), [CODE] <> Exclusion), [CODE] ,", ") &
"

[" & COUNTROWS(FILTER(MyTable, MyTable[CODE] = Exclusion))+0 & " " & Exclusion & " values]"