MDX查询,如何选择事件周期的第一年和最后一年

MDX查询,如何选择事件周期的第一年和最后一年,mdx,pentaho,olap,report-designer,Mdx,Pentaho,Olap,Report Designer,我有一个来自我大学教师的出版物数据集市,我想选择教师名单,列出他们写了多少书,以及他们出版这些书的时间 范例 教师-出版的最后一年-图书数量 教师A-2014-200册 我试着做一些类似的事情: WITH MEMBER [Measures].[LastYear] AS '(ClosingPeriod([Anno].[Anno]) ,[Autore].[Nome].CurrentMember)' SELECT {[Measures].[Unita (Libri)],

我有一个来自我大学教师的出版物数据集市,我想选择教师名单,列出他们写了多少书,以及他们出版这些书的时间

范例 教师-出版的最后一年-图书数量

教师A-2014-200册

我试着做一些类似的事情:

WITH MEMBER [Measures].[LastYear] AS 
   '(ClosingPeriod([Anno].[Anno])
         ,[Autore].[Nome].CurrentMember)'
SELECT 
  {[Measures].[Unita (Libri)],[Measures].[LastYear]} ON COLUMNS,
NON EMPTY 
   [Autore].[Nome].Members ON ROWS
FROM [Pubblicazioni]
但去年的场地总是空的,如果我试图用[措施]来改变结束期的第二部分,它也是空的。。。我应该如何实现该查询?我有点困惑

编辑

这一条对老师来说非常有用[Fazzinga,Bettina],但是当我在做的时候,查询停止了

select [Measures].[Libri] ON COLUMNS,
crossjoin([Autore.default].[Nome].Members, tail(NonEmptyCrossJoin([Autore.default].[Nome].CurrentMember, [Anno.default].[Anno].Members), 1).Item(0).Item(1)) ON ROWS
from [Pubblicazioni]

度量值需要某种形式的值或字符串才能返回,我认为这就是为什么度量值返回void,因为ClosingPeriod返回的是成员而不是值

以下内容未经测试:

WITH MEMBER [Measures].[LastYear] AS 
   '(Tail(
       nonempty(
         [Anno].[Anno]
         ,([Autore].[Nome].CurrentMember, [Measures].[Unita (Libri)])
       )
    ).item(0).item(0).MEMBERVALUE)'
SELECT 
  {[Measures].[Unita (Libri)],[Measures].[LastYear]} ON COLUMNS,
NON EMPTY 
   [Autore].[Nome].Members ON ROWS
FROM [Pubblicazioni]
试试这个:

SELECT 
  [Measures].[Libri] ON COLUMNS

 ,Generate
  (
    [Autore.default].[Nome].MEMBERS
   ,Tail
    (
      //NonEmptyCrossJoin <<hopefully nonempty is enough
      NonEmpty
      (
        [Autore.default].[Nome].CurrentMember * [Anno.default].[Anno].MEMBERS
      )
     ,1
    ) //.Item(0).Item(1) //<<don't believe this is required
  ) ON ROWS
FROM [Pubblicazioni];

我终于找到了一个办法。。。从本质上讲,包含member的子句中的每个计算成员都被视为多维数据集的信息。在我的例子中,如果我做作者工作年份的maxxpression,它将给出他在相对最大年份写的书的数量。为了避免这种情况,有一个名为SetToStr的构造,它将把年份打印为类似[Hyerarchie].[Level].[Value]的字符串。该管柱可在左右条件下进行简单切割。结果如下:

WITH MEMBER [Measures].[Anno prima pubblicazione] AS 'left(right(settostr(head(extract(nonemptycrossjoin([Anno].[Anno].Members, nonemptycrossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember)),[Anno]),1)),6),4)'
MEMBER [Measures].[Anno ultima pubblicazione] AS 'left(right(settostr(tail(extract(nonemptycrossjoin([Anno].[Anno].Members, nonemptycrossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember)),[Anno]),1)),6),4)'
SELECT {[Measures].[Anno prima pubblicazione],[Measures].[Anno ultima pubblicazione]} ON COLUMNS,
[Autore].[Nome].Members ON ROWS
FROM [Pubblicazioni]
此查询的工作方式如下:

1使用非空交叉连接[Libro].[Titolo].Members[Autore].[Nome].CurrentMember为当前作者提取书籍,以便获得元组

2我让年份与nonemptycrossjoin[Anno][Anno]一起加入上一个元组。成员

3在我的情况下,DM已经订购了一年,在其他情况下,我们甚至应该使用功能订单

4我们不需要所有这些东西,所以我们用extract[Anno]丢弃我们不需要的东西,这意味着我将只维护层次结构[Anno]的值

5.我们只需要订购年份列表的第一个条目,我们使用head函数

6我们还不能使用该值,否则MDX将为我们选择的[Anno]值计算事实表中的条目,因此我们使用setToStr将其转换为字符串

7该值仍然脏,因为字符串也有层次结构,所以我们使用左右函数来清理它。一年总是由4个字符组成


这是一个有点大的函数,但这是唯一一个对我有效的函数:

使用最大聚合来查找该教师的最大年份,即最近一年,而不是总和聚合如何?我尝试使用类似于成员[Measures].[topyer]的函数作为“MAX[Anno].[Anno].Members”,它给我的值是3、4、5。。。我不知道您为什么希望阅读有关聚合函数的内容,它与您在那里所做的稍有不同。请参见@magnusmith如何处理聚合?O.oI认为,教师出版一本书的所有年份的列表可以通过寻找最大值而变成“最后出版日期”。很抱歉将您与聚合混淆,我发现只有当多维数据集本身的聚合选项设置为最大值时,此选项才有用。默认值为SUM。Mondrian错误:没有函数与签名“NoneEmpty”匹配。无论如何,我使用新查询编辑了此问题,通过查看您的查询认为是这样,但是。currentmember不工作:。如果我在[去年]的专栏中使用这个结果作为[度量],它会给出我的书籍数量
WITH MEMBER [Measures].[Anno prima pubblicazione] AS 'left(right(settostr(head(extract(nonemptycrossjoin([Anno].[Anno].Members, nonemptycrossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember)),[Anno]),1)),6),4)'
MEMBER [Measures].[Anno ultima pubblicazione] AS 'left(right(settostr(tail(extract(nonemptycrossjoin([Anno].[Anno].Members, nonemptycrossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember)),[Anno]),1)),6),4)'
SELECT {[Measures].[Anno prima pubblicazione],[Measures].[Anno ultima pubblicazione]} ON COLUMNS,
[Autore].[Nome].Members ON ROWS
FROM [Pubblicazioni]