按多对多表过滤

时间:2015-11-03 08:00:48

标签: sql-server dax ssas-tabular

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

这是我的数据库架构。

A simple database schema

这是我的数据。

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 ║
╚════╩═════════════╝

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

  • 表项目:项目股票:= SUM([股票])
  • 表部分: 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 ║
╚═════════╩═══════════╝

我做错了什么?

1 个答案:

答案 0 :(得分:0)

MDX对我来说不得而知,但这是一个纯粹的SQL解释。

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

Link to image

要使用特定[状态]获取[部件]的[项目],我将使用此纯SQL:

SELECT Item.Name
FROM Item INNER JOIN Part ON Item.Id = Part.ItemID
WHERE Part.StatusID = 1;

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