DAX:仅当数据集中存在所有年份的数据时才计算

DAX: Calculate only when data is present for all years in dataset

我有一个数据集,其中包含 5 年以上按年分类的销售预测数据。

每一行都有客户、项目类型、年份、数量和销售价格。

并非所有客户都购买所有年份的所有产品。

我想获取所列年份 所有 年购买的所有产品的列表。

一个示例,缩减 table 如下所示:

Customer    Product Year    Qty Price
CustA       ProdA   2020    50  100
CustA       ProdA   2021    50  100
CustA       ProdA   2022    50  100
CustA       ProdB   2020    50  100
CustA       ProdB   2021    50  100
CustA       ProdC   2021    50  100
CustA       ProdC   2022    50  100
CustA       ProdD   2020    50  100
CustA       ProdD   2021    50  100
CustA       ProdD   2022    50  100
CustB       ProdA   2021    50  100
CustB       ProdA   2022    50  100
CustB       ProdC   2020    50  100
CustB       ProdC   2021    50  100
CustB       ProdC   2022    50  100
CustB       ProdD   2020    50  100
CustB       ProdD   2021    0   100
CustB       ProdD   2022    50  100

然后转置,看起来像这样:

Customer    Product     2020    2021    2022
CustA       ProdA       50      50      50
CustA       ProdB       50      50
CustA       ProdC               50      50
CustA       ProdD       50      50      50
CustB       ProdA               50      50
CustB       ProdC       50      50      50
CustB       ProdD       50      0       50

因此,对于此示例,我想计算或指示具有所有三年销售数量的行。我试图使用下面的公式,我将其与集合中的最大年数进行比较,以将一行标记为有效或无效,但它正在杀死 Excel。源 table.

中只有 32,000 行
=CALCULATE(
      DISTINCTCOUNT(DataTable[Year]), 
      filter(DataTable, DataTable[Product] = EARLIER(DataTable[Product])), 
      filter(DataTable, DataTable[Customer] = EARLIER(DataTable[Customer])), 
      filter(DataTable, DataTable[Qty] > 0)
    )

我可以使用更好的方法吗?

您不需要使用 dax 来实现此目的。使用所需数据创建矩阵可视化。 它应该看起来像这样:

记得禁用合计和小计选项。

这是使用新列的其他解决方案,因此您不必扩展矩阵。

Column = COMBINEVALUES( " ", Table[Customer], Table[Product] )

希望对你有帮助。

这个怎么样?

ProductList =
VAR AllYears = DISTINCTCOUNT ( 'DataTable'[Year] )
VAR Summary =
    SUMMARIZE (
        'DataTable',
        'DataTable'[Product],
        "YearsPurchased", CALCULATE (
            DISTINCTCOUNT ( 'DataTable'[Year] ),
           'DataTable'[Qty] > 0
        )
    )
RETURN
    SELECTCOLUMNS (
        FILTER ( Summary, [YearsPurchased] = AllYears ),
        "Product", [Product]
    )

SummaryProduct 级别聚合并查看它有多少个非零数量的不同年份。然后你只需过滤匹配 AllYears 的那些,然后选择 Product 列。


请注意,此 returns 是一个单独的列 table,因此不能用作计算列或度量,但列表正是您所要求的。

编辑: 要将 YearsPurchased 作为计算列,您只需要其中的一部分:

YearsPurchased =
CALCULATE (
    DISTINCTCOUNT ( 'DataTable'[Year] ),
    FILTER ( ALLEXCEPT ( 'DataTable', 'DataTable'[Product] ), 'DataTable'[Qty] > 0 )
)