我很难理解如何过滤掉多维表达式的结果。
这是我的数据库模式。
这是我的数据。
Manufacturer
╔════╦═══════════════════╗
║ Id ║ Name ║
╠════╬═══════════════════╣
║ 1 ║ Awesome Computers ║
║ 2 ║ TailSpin Toys ║
╚════╩═══════════════════╝
Item
╔════╦═════════╦════════════════╦═══════╗
║ Id ║ Name ║ ManufacturerId ║ Stock ║
╠════╬═════════╬════════════════╬═══════╣
║ 1 ║ PC ║ 1 ║ 40 ║
║ 2 ║ Server ║ 1 ║ 10 ║
║ 3 ║ STB ║ 2 ║ 80 ║
║ 4 ║ Console ║ 2 ║ 50 ║
╚════╩═════════╩════════════════╩═══════╝
Part
╔════╦══════════════════╦════════╦══════════╦═══════╗
║ Id ║ Name ║ ItemId ║ StatusId ║ Stock ║
╠════╬══════════════════╬════════╬══════════╬═══════╣
║ 1 ║ MBO ║ 1 ║ 1 ║ 100 ║
║ 2 ║ Processor ║ 1 ║ 1 ║ 100 ║
║ 3 ║ Server MBO ║ 2 ║ 2 ║ 20 ║
║ 4 ║ Server processor ║ 2 ║ 2 ║ 20 ║
║ 5 ║ Main box ║ 3 ║ 2 ║ 40 ║
║ 7 ║ Adapter ║ 3 ║ 3 ║ 30 ║
║ 8 ║ Controller ║ 4 ║ 2 ║ 40 ║
║ 10 ║ Adapter ║ 4 ║ 1 ║ 60 ║
║ 11 ║ Memory card ║ 4 ║ 2 ║ 80 ║
╚════╩══════════════════╩════════╩══════════╩═══════╝
Status
╔════╦═════════════╗
║ Id ║ Name ║
╠════╬═════════════╣
║ 1 ║ No data ║
║ 2 ║ Available ║
║ 3 ║ Unavailable ║
╚════╩═════════════╝
我将所有内容导入表格模型解决方案。在此之后,我创建了两个措施:
- 表项目:ItemStock:=SUM([Stock])
- 表格部分:PartStock:=SUM([Stock])
然后我将多维数据集部署到服务器。
通过运行以下 MDX 查询...
SELECT
NON EMPTY {
[Part].[Name].CHILDREN
} ON ROWS,
{
[Measures].[PartStock]
} ON COLUMNS
FROM [Model]
WHERE (
{
[Status].[Id].&[1]
}
)
...我得到这个结果集...
╔═══════════╦═══════════╗
║ ║ PartStock ║
╠═══════════╬═══════════╣
║ Adapter ║ 60 ║
║ MBO ║ 100 ║
║ Processor ║ 100 ║
╚═══════════╩═══════════╝
...没关系。
但是,在运行此 MDX 查询时...
SELECT
NON EMPTY {
[Item].[Name].CHILDREN
} ON ROWS,
{
[Measures].[ItemStock]
} ON COLUMNS
FROM [Model]
WHERE (
{
[Status].[Id].&[1]
}
)
...我得到这个结果集...
╔═════════╦═══════════╗
║ ║ ItemStock ║
╠═════════╬═══════════╣
║ Console ║ 50 ║
║ PC ║ 40 ║
║ Server ║ 10 ║
║ STB ║ 80 ║
╚═════════╩═══════════╝
我原以为 ItemStock 表中的项目会被Part表作为多对多关系过滤掉。例如,MBO、处理器和适配器引用了项目 1 和 4,因此结果将受限于它们,结果应该如下所示:
╔═════════╦═══════════╗
║ ║ ItemStock ║
╠═════════╬═══════════╣
║ Console ║ 50 ║
║ PC ║ 40 ║
╚═════════╩═══════════╝
我究竟做错了什么?
假设我们正在谈论 SSAS 2012 或 2014 中的表格模型(自 2016 年以来具有双向交叉过滤的新功能)交叉过滤仅在一个方向上流过关系。所以过滤
Status
会 crossfilterPart
,但不会Item
orManufacturer
。过滤Manufacturer
将交叉过滤Item
,Part
但不会Status
。您在表格模型中嵌入的任何计算都必须用 DAX 编写。因此,如果你想过滤
Status
并让它影响ItemStock
你需要编码的措施:有关 DAX 中多对多公式的更多理论: