Ssas MDX:为不同标准组合输出

Ssas MDX:为不同标准组合输出,ssas,mdx,Ssas,Mdx,我不熟悉MDX查询,并且在SSAS工作。我有两个查询可以正常工作,但我希望它们的输出组合在一个结果中。这两个查询在where子句选择的城市中有所不同,但它们都来自同一个多维数据集并使用相同的度量 A到B:供应商城市A到消费者城市B SELECT { [Measures].[Quantity - Transactions] } ON COLUMNS, { [Tb Product].[Name].[Name].ALLMEMBERS } ON ROWS FROM [Cube] WHERE

我不熟悉MDX查询,并且在SSAS工作。我有两个查询可以正常工作,但我希望它们的输出组合在一个结果中。这两个查询在where子句选择的城市中有所不同,但它们都来自同一个多维数据集并使用相同的度量

A到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 to消费者城市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中,我会使用一个完整的外部联接,但在MDX中我无法找到等效的联接

| | A_to_B | B_to_A | | ProductA | 10 | 2 | | ProductB | 100 | 0 | | ProductC | 0 | 99 | || A|u|B|u|A| |产品A | 10 | 2| |产品B | 100 | 0| |产品C | 0 | 99|
只需将语句移动到以下列:

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];
此消息:

查询(5,7)函数需要1的元组集表达式 论点使用了字符串或数字表达式

这是因为您需要将交叉联接的任意一侧专门设置为一个集合—如果没有额外的括号,它将不知道这一点,并引发异常

这是剧本的“完美”版本:

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]

如果您也将
[Measures].[Quantity-Transactions]
移到WHERE子句,是否会更整洁?完美无极限不太可能,没有Where子句。:)谢谢有没有办法创建标题,a_to_B和B_to_a?当然,我的答案中添加了。啊,对了,谢谢你的更正!我已经更新了我的答案。您也可以使用no*:{([D1],[H1].[M1],[D2],[H2].[M2]),([D1],[H1].[M2],[D2],[H2].[M1])。