MDX查询-销售所有给定产品的最佳推销员

MDX查询-销售所有给定产品的最佳推销员,mdx,data-warehouse,Mdx,Data Warehouse,假设我有两个简单的维度: 产品-带有id和名称 销售人员-带id和姓名 我的事实表名为SALES,包含上述的ID 我需要生成一个查询,显示销售所有给定产品的销售人员的姓名 此代码解决了两个项目X和Y的问题: SELECT {} on 0, EXISTS( EXISTS( {[Salesmen].[Name].MEMBERS}, {[Products].[Name].&[X]} ) ,{[Products].[Name].&a

假设我有两个简单的维度:

产品-带有id和名称

销售人员-带id和姓名 我的事实表名为SALES,包含上述的ID

我需要生成一个查询,显示销售所有给定产品的销售人员的姓名

此代码解决了两个项目X和Y的问题:

SELECT 
  {} on 0,
  EXISTS(
    EXISTS(
       {[Salesmen].[Name].MEMBERS}, 
       {[Products].[Name].&[X]}
    )
    ,{[Products].[Name].&[Y]}
  )
  ON 1
FROM [Test];
另一个版本是:

SELECT 
  {} on 0,
  INTERSECT(
    NONEMPTY(
       {[Salesmen].[Name].MEMBERS}
       ,([Products].[Name].&[X])
    )
   ,NONEMPTY(
       {[Salesmen].[Name].MEMBERS}
       ,([Products].[Name].&[Y])
    )
  )
  ON 1
FROM [Test];

但是,如果给定产品的列表很大,例如-100个随机产品,则此方法会变得很麻烦。

您是否有层次结构
[products].[Name]
的属性
成员密钥
?我们可以这样测试:

WITH
MEMBER [Measures].[Meas1] AS
 [Products].[Name].CurrentMember.PROPERTIES("KEY ID")
MEMBER [Measures].[Meas2] AS
 [Products].[Name].CurrentMember.MEMBER_Key
MEMBER [Measures].[Meas3] AS
 [Products].[Name].CurrentMember.MEMBERvalue
select
 {
  [Measures].[Meas1]
 ,[Measures].[Meas2]
 ,[Measures].[Meas3]
 } on COLUMNS, 
 [Products].[Name].MEMBERS on ROWS
FROM [Test];
希望其中一个自定义度量可以为您提供一个值?我假设Meas2正在工作(如果Meas1或Meas3返回数字,则换成另一个)

与
成员[措施][措施2]如下:
[产品].[名称].CurrentMember.MEMBER\u密钥
将[ProdsetA]设置为
滤器(
[产品].[名称].成员
,[措施][措施2]500
)
挑选
{}在0上,
相交(
非空(
{[Salesmen].[Name].MEMBERS}
,[ProdsetA]
)
,非空(
{[Salesmen].[Name].MEMBERS}
,[ProdsetB]
)
)
在1号
来自[测试];

。。。
>100
我认为
存在
版本不起作用?当两个维度具有相同的层次结构时,存在可以起作用-在我编写的一个简单示例中,情况并非如此。然而,在更详细的项目中,exists解决方案实际上起了作用(因为维度在同一层次结构中)-我将在其他版本的数据库中进行编辑-你是对的(我忘记了),exists解决方案适用于同一维度中的不同层次结构,例如,假设你需要从城镇层次结构中查找城镇(在地理维度中)从国家层级(也在地理维度)来看,波兰国家存在这种情况。我提到的第三个参数(度量值组)是扩展的,因此它可以跨维度运行。下面是此函数的
MSDN
定义:@whytheq谢谢!我很快就会分析你的答案!(顺便说一句,到目前为止,我知道第二个成员确实有效!但我不知道你键入
>100
的意思
>100
谢谢!终于有时间回到这一点上了-它真的很有帮助:)
WITH
  MEMBER [Measures].[Meas2] AS
   [Products].[Name].CurrentMember.MEMBER_Key
  SET [ProdsetA] AS
   FILTER(
     [Products].[Name].MEMBERS
     ,[Measures].[Meas2] <100
   )
  SET [ProdsetB] AS
   FILTER(
     [Products].[Name].MEMBERS
     ,[Measures].[Meas2] >500
   )
SELECT 
 {} on 0,
 INTERSECT(
   NONEMPTY(
      {[Salesmen].[Name].MEMBERS}
      ,[ProdsetA]
   )
  ,NONEMPTY(
      {[Salesmen].[Name].MEMBERS}
      ,[ProdsetB]
   )
 )
 ON 1
FROM [Test];