0

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

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

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

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

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

客户 产品 年份 数量 价格
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

并转置,看起来像这样:

客户产品 2020 2021 2022
CustA ProdA 50 50 50
CustA ProdB 50 50
CustA ProdC 50 50
客户产品 50 50 50
CustB ProdA 50 50
CustB 产品 50 50 50
CustB 产品 50 0 50

因此,对于此示例,我想对所有三年都有销售数量的行进行计算或指示。我试图使用以下公式与集合中的最大年数进行比较,以将行标记为有效或无效,但它正在杀死 Excel。源表中只有 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)
    )

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

4

2 回答 2

0

这个怎么样?

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]
    )

该级别的Summary聚合Product并查看它有多少个不同的年份,数量为非零。然后,您只需过滤匹配的内容AllYears并获取该Product列。


请注意,这将返回一个单列表,因此不能用作计算列或度量,但您需要的是一个列表。

编辑:要获得YearsPurchased计算列,您只需要其中的一部分:

YearsPurchased =
CALCULATE (
    DISTINCTCOUNT ( 'DataTable'[Year] ),
    FILTER ( ALLEXCEPT ( 'DataTable', 'DataTable'[Product] ), 'DataTable'[Qty] > 0 )
)
于 2020-05-05T17:48:47.887 回答
0

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

在此处输入图像描述

请记住禁用总计和小计选项。

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

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

在此处输入图像描述

希望它可以帮助你。

于 2020-05-05T16:39:43.213 回答