Estou tendo dificuldade para entender como filtrar o resultado da expressão multidimensional.
Este é o esquema do meu banco de dados.
E estes são meus dados.
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 ║
╚════╩═════════════╝
Importei tudo para a solução do modelo tabular. Depois disso, criei duas medidas:
- Item da tabela: ItemEstoque:=SUM([Estoque])
- Parte da Tabela: ParteEstoque:=SOMA([Estoque])
Em seguida, implantei o cubo no servidor.
Executando a seguinte consulta MDX...
SELECT
NON EMPTY {
[Part].[Name].CHILDREN
} ON ROWS,
{
[Measures].[PartStock]
} ON COLUMNS
FROM [Model]
WHERE (
{
[Status].[Id].&[1]
}
)
...Eu recebo este conjunto de resultados...
╔═══════════╦═══════════╗
║ ║ PartStock ║
╠═══════════╬═══════════╣
║ Adapter ║ 60 ║
║ MBO ║ 100 ║
║ Processor ║ 100 ║
╚═══════════╩═══════════╝
... o que está bem.
No entanto, ao executar esta consulta MDX...
SELECT
NON EMPTY {
[Item].[Name].CHILDREN
} ON ROWS,
{
[Measures].[ItemStock]
} ON COLUMNS
FROM [Model]
WHERE (
{
[Status].[Id].&[1]
}
)
...estou obtendo este conjunto de resultados...
╔═════════╦═══════════╗
║ ║ ItemStock ║
╠═════════╬═══════════╣
║ Console ║ 50 ║
║ PC ║ 40 ║
║ Server ║ 10 ║
║ STB ║ 80 ║
╚═════════╩═══════════╝
Eu esperava que os itens na tabela ItemStock fossem filtrados pela tabela Part como uma relação muitos-para-muitos. Por exemplo, MBO, Processor e Adapter possuem referências aos itens 1 e 4, então o resultado seria restrito a eles, e o resultado deveria ficar assim:
╔═════════╦═══════════╗
║ ║ ItemStock ║
╠═════════╬═══════════╣
║ Console ║ 50 ║
║ PC ║ 40 ║
╚═════════╩═══════════╝
O que estou fazendo errado?
Supondo que estamos falando sobre modelos tabulares no SSAS 2012 ou 2014 (desde 2016 tem um novo recurso em torno da filtragem cruzada bidirecional), a filtragem cruzada flui apenas sobre os relacionamentos em uma direção. Portanto, a filtragem
Status
cruzará o filtroPart
, mas nãoItem
ouManufacturer
. A filtragemManufacturer
fará um filtro cruzadoItem
e,Part
mas nãoStatus
.Qualquer cálculo que você incorporar em um modelo Tabular deve ser escrito em DAX. Portanto, se você deseja filtrar
Status
e impactar aItemStock
medida, precisa codificar isso:Mais teoria sobre fórmulas muitos-para-muitos no DAX: