MDX query - best salesmen who sold all of given products

好久不见. 提交于 2019-12-24 10:40:58

问题


Let's say I have two simple dimensions:

Products - with id and name

Salesmen - with id and name My fact table is named SALES and contains the ids of the abovementioned.

I need to produce a query that will show the names of salesmen who sold all of the given products.

This code solves the problem for two items X and Y:

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

The other version is:

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

However, this method becomes troublesome if the list of given products is large, for example - 100 random products..


回答1:


Do you have a property member_key for the hierarchy [Products].[Name] ? We can test like this:

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];

Hopefully one of the custom measures gives you a value? I'll assume Meas2 is working (swap to a different one if Meas1 or Meas3 is returning numbers)

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];

... the >100 and <500 are important. These are the criteria for the filter function to use. The custom set [ProdsetA] will only contain Products that have MEMBER_Key that are <100 whereas the custom set [ProdsetB] will only contain Products that have MEMBER_Key that are >500. You need to use the member values presented to you by the first script to decide what values 100 and 500 should be in your cube context (...I don't know the key values in your cube so just used 100 and 500 as placeholders)



来源:https://stackoverflow.com/questions/29514866/mdx-query-best-salesmen-who-sold-all-of-given-products

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!