按多对多表过滤

Ozr*_*ric 5 sql-server dax ssas-tabular

我很难理解如何过滤掉多维表达式的结果.

这是我的数据库架构.

简单的数据库架构

这是我的数据.

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 ?
????????????????????
Run Code Online (Sandbox Code Playgroud)

我将所有内容导入到表格模型解决方案中.在此之后,我创建了两个措施:

  • 表项目:ItemStock:= SUM([股票])
  • 表部分:PartStock:= SUM([股票])

然后我将多维数据集部署到服务器.

通过运行以下MDX查询...

SELECT 
    NON EMPTY { 
        [Part].[Name].CHILDREN
    } ON ROWS,
    { 
        [Measures].[PartStock]
    } ON COLUMNS
FROM [Model]
WHERE (
    {
        [Status].[Id].&[1]
    }
)
Run Code Online (Sandbox Code Playgroud)

...我得到了这个结果集......

?????????????????????????
?           ? PartStock ?
?????????????????????????
? Adapter   ?        60 ?
? MBO       ?       100 ?
? Processor ?       100 ?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)

......没关系.

但是,运行此MDX查询时...

SELECT 
    NON EMPTY { 
        [Item].[Name].CHILDREN
    } ON ROWS,
    { 
        [Measures].[ItemStock]
    } ON COLUMNS
FROM [Model]
WHERE (
    {
        [Status].[Id].&[1]
    }
)
Run Code Online (Sandbox Code Playgroud)

......我得到了这个结果集......

???????????????????????
?         ? ItemStock ?
???????????????????????
? Console ?        50 ?
? PC      ?        40 ?
? Server  ?        10 ?
? STB     ?        80 ?
???????????????????????
Run Code Online (Sandbox Code Playgroud)

我期待ItemStock表中的项目将被Part表过滤掉为多对多关系.例如,MBO,处理器和适配器都引用了第1项和第4项,因此结果将受限于它们,结果应如下所示:

???????????????????????
?         ? ItemStock ?
???????????????????????
? Console ?        50 ?
? PC      ?        40 ?
???????????????????????
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 0

MDX 对我来说是未知的,但这里是一个纯粹的 SQL 解释。

你的模型实际上是这样的:

链接到图像

要获取具有特定 [状态] 的 [零件] 的 [项目],我将使用以下纯 SQL:

SELECT Item.Name
FROM Item INNER JOIN Part ON Item.Id = Part.ItemID
WHERE Part.StatusID = 1;
Run Code Online (Sandbox Code Playgroud)

我可以在您的示例中看到您使用 FROM [Model],但您的设置中没有名为 Model 的表 - 因此这可能是您应该研究的 VIEW 或 MDX 的某些功能。对于 [Model] 视图,表之间的 JOIN 可能是错误的。