MDX查询,其中维度属性介于两个值之间,另一个维度属性等于另一个值

时间:2014-05-09 14:08:27

标签: mdx pentaho olap mondrian

我试图建立一个查询,选择2014年年龄介于1到20岁之间的用户制作的十大产品(最喜欢的)。我试图使用以下查询:

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes])
SELECT {[Measures].[Likes]}
ON COLUMNS, {[TopProducts]}
ON ROWS FROM [Likes]
WHERE (
  {[Ages].[Age].[1]:[Ages].[Age].[24]},
  [Date].[Year].[2014]
)

此查询返回错误:No function matches signature '(<Set>, <Member>)'

如果我从查询中删除[Date.Date].[Year].[2014],它可以顺利运行,所以我认为问题在于where子句的制定。我在这做错了什么?这是进行此查询的方式吗?

由于

3 个答案:

答案 0 :(得分:2)

在WHERE子句中,您需要指定一个元组。元组是一组或多个维度的无序成员。

试试这个:

WITH 
  SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes])
  MEMBER [Ages].[Range] as Aggregate( [Ages].[Age].[1]:[Ages].[Age].[24] )
SELECT {[Measures].[Likes]}
  ON COLUMNS, {[TopProducts]}
  ON ROWS FROM [Likes]
WHERE ( [Ages].[Range], [Date].[Year].[2014] )

Aggregate函数接受一个set并返回一个成员,该成员是该集合中所有元素的聚合。现在你在WHERE子句上的元组是正确的,因为它引用了两个不同维度的两个成员。

答案 1 :(得分:0)

USE CROSS JOIN创建了&#39; Direct&#34;的所有组合。成员和我的范围中的日期作为我的WHERE切片器的元组。我认为这是正确的答案。

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].
[Likes])
SELECT {[Measures].[Likes]}
ON COLUMNS, {[TopProducts]}
ON ROWS FROM [Likes]   
WHERE CROSSJOIN([Date].[Year].[2014],{[Ages].[Age].[1]:[Ages].[Age].[24]})

答案 2 :(得分:-1)

您的切片器谓词尝试对集合和成员进行交叉产品。那是不可能的。

在日期成员周围添加括号('{'&amp;'}'),将其转换为一个成员集。它将成为包含两组的复合谓词。

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes])
SELECT {[Measures].[Likes]}
ON COLUMNS, {[TopProducts]}
ON ROWS FROM [Likes]
WHERE (
  {[Ages].[Age].[1]:[Ages].[Age].[24]} *
  {[Date].[Year].[2014]}
)