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]
)
Summary
在 Product
级别聚合并查看它有多少个非零数量的不同年份。然后你只需过滤匹配 AllYears
的那些,然后选择 Product
列。
请注意,此 returns 是一个单独的列 table,因此不能用作计算列或度量,但列表正是您所要求的。
编辑: 要将 YearsPurchased
作为计算列,您只需要其中的一部分:
YearsPurchased =
CALCULATE (
DISTINCTCOUNT ( 'DataTable'[Year] ),
FILTER ( ALLEXCEPT ( 'DataTable', 'DataTable'[Product] ), 'DataTable'[Qty] > 0 )
)
我有一个数据集,其中包含 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]
)
Summary
在 Product
级别聚合并查看它有多少个非零数量的不同年份。然后你只需过滤匹配 AllYears
的那些,然后选择 Product
列。
请注意,此 returns 是一个单独的列 table,因此不能用作计算列或度量,但列表正是您所要求的。
编辑: 要将 YearsPurchased
作为计算列,您只需要其中的一部分:
YearsPurchased =
CALCULATE (
DISTINCTCOUNT ( 'DataTable'[Year] ),
FILTER ( ALLEXCEPT ( 'DataTable', 'DataTable'[Product] ), 'DataTable'[Qty] > 0 )
)