MDX:组合不同标准的输出

MDX: Combining output for different criteria

我是 MDX 查询的新手,并且在 SSAS 中工作。我有两个工作正常的查询,但我希望将它们的输出合并为一个结果。这两个查询在它们的 where 子句选择的城市不同,但它们都来自同一个立方体并使用相同的度量。

A_to_B:供应城市A到消费者城市B

SELECT { [Measures].[Quantity - Transactions] } ON COLUMNS,
       { [Tb Product].[Name].[Name].ALLMEMBERS } ON ROWS
FROM [Cube]
WHERE ([Tb Supplier].[City].&[A],
       [Tb Consumer].[City].&[B])

B_to_A:供应城市B到消费者城市A

SELECT { [Measures].[Quantity - Transactions] } ON COLUMNS,
       { [Tb Product].[Name].[Name].ALLMEMBERS } ON ROWS
FROM [Cube]
WHERE ([Tb Supplier].[City].&[B],
       [Tb Consumer].[City].&[A])

有没有一种方法可以像这样按产品并排生成这些查询的输出?在 SQL 中,我会使用 FULL OUTER JOIN,但我无法找出 MDX 中的等价物。

|          | A_to_B | B_to_A |
| ProductA |     10 |      2 |
| ProductB |    100 |      0 |
| ProductC |      0 |     99 |

只需将 Where 语句移至列:

Select
{[Measures].[Quantity - Transactions]} *
{
    ([Tb Supplier].[City].&[B], [Tb Consumer].[City].&[A]),
    ([Tb Supplier].[City].&[A], [Tb Consumer].[City].&[B])
} on 0,
{[Tb Product].[Name].[Name].AllMembers} on 1
From [Cube]

您可以创建计算成员以合并两个元组:

With 

Member [Tb Supplier].[City].[B2A] as
Aggregate([Tb Supplier].[City].&[B], [Tb Consumer].[City].&[A])

Member [Tb Supplier].[City].[A2B] as
Aggregate([Tb Supplier].[City].&[A], [Tb Consumer].[City].&[B])

Select 
    {[Tb Supplier].[City].[A2B],[Tb Supplier].[City].[B2A]} on 0
From [Cube]
Where ([Measures].[Quantity - Transactions])

我测试了这个脚本,它抛出了一个异常:

SELECT 
    {[Measures].[Internet Sales Amount]}
  * 
    {
      {[Geography].[Geography].[Country].&[United States] * [Product].[Category].&[1]}
     ,{[Geography].[Geography].[Country].&[France] * [Product].[Category].&[3]}
    } ON 0
 ,{[Date].[Calendar].[Date].&[20070801]} ON 1
FROM [Adventure Works];

这条消息:

Query (5, 7) The function expects a tuple set expression for the 1 argument. A string or numeric expression was used.

这是因为您需要将交叉连接的任一侧专门设置为一个集合 - 没有额外的括号它不知道这一点并抛出异常。

所以这是脚本的 "perfect" 版本:

SELECT 
    {[Measures].[Internet Sales Amount]}
  * 
    {
      {[Geography].[Geography].[Country].&[United States]} * {[Product].[Category].&[1]}
     ,{[Geography].[Geography].[Country].&[France]} * {[Product].[Category].&[3]}
    } ON 0
 ,{[Date].[Calendar].[Date].&[20070801]} ON 1
FROM [Adventure Works];

我更愿意将度量移至 WHERE 子句并去掉一些多余的大括号:

SELECT 
  {
      {[Geography].[Geography].[Country].&[United States]}
    * 
      {[Product].[Category].&[1]}
   ,
      {[Geography].[Geography].[Country].&[France]}
    * 
      {[Product].[Category].&[3]}
  } ON 0
 ,[Date].[Calendar].[Date].&[20070801] ON 1
FROM [Adventure Works]
WHERE 
  [Measures].[Internet Sales Amount];

翻译成你的多维数据集:

SELECT 
  {
    {[Tb Supplier].[City].&[B]} * {[Tb Consumer].[City].&[A]}
   ,
    {[Tb Supplier].[City].&[A]} * {[Tb Consumer].[City].&[B]}
  } ON 0
 ,[Tb Product].[Name].[Name].ALLMEMBERS ON 1
FROM [Cube]
WHERE 
  [Measures].[Quantity - Transactions];

在其他人的基础上,这是一个在输出中用零替换空值的方法。

With 

Member [Tb Supplier].[City].[B2A] as
Aggregate([Tb Supplier].[City].&[B], [Tb Consumer].[City].&[A])

Member [Tb Supplier].[City].[A2B] as
Aggregate([Tb Supplier].[City].&[A], [Tb Consumer].[City].&[B])

Member [Measures].[Quantity_Transactions] as
    Iif( IsEmpty( [Measures].[Quantity - Transactions] ), 
    0, 
    [Measures].[Quantity - Transactions] )

SELECT 
    { [Measures].[Quantity_Transactions] } *
    { [Tb Supplier].[City].[B2A], 
      [Tb Supplier].[City].[A2B] } on COLUMNS
    , [Tb Product].[Name].[Name].ALLMEMBERS ON ROWS
FROM [Cube]