0

我有一个来自我大学教师的出版物数据集市,我想选择教师列表,其中包含他们写了多少书以及他们出版这些书的时期。

示例教师 - 出版的最后一年 - 书籍数量

老师 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]

但是去年的字段总是无效的,如果我尝试用 [Measures].[Unita (libri)] 更改 ClosingPeriod 的第二部分,它也是空的......我应该如何实现该查询?我有点困惑

编辑

select [Measures].[Libri] ON COLUMNS,
crossjoin([Autore.default].[Nome].[Fazzinga, Bettina], tail(NonEmptyCrossJoin([Autore.default].[Nome].[Fazzinga, Bettina], [Anno.default].[Anno].Members), 1).Item(0).Item(1)) 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]
4

2 回答 2

0

度量需要某种形式的值或字符串才能返回,我认为这就是为什么您的度量返回 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];
于 2014-11-05T19:04:28.153 回答
0

我终于找到了一种方法来获得它......原生地,“WITH MEMBER”子句中的每个计算成员都被视为多维数据集的信息。就我而言,如果我做 max("xpression of years when author working") 它将给出他在相对最大年份写的书的数量。为避免这种情况,有一个名为 SetToStr() 的构造将年份打印为字符串(类似于 [Hyerarchie].[Level].[Value])。字符串可以简单地用 left() 和 right() 条件切割。结果如下:

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) 使用 nonemptycrossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember) 为当前作者提取书籍,这样我就得到了元组;

2)我让年份加入前一个元组 nonemptycrossjoin([Anno].[Anno].Members,);

3)在我的情况下,DM 已经订购了一年,在其他情况下,我们甚至应该使用函数 order;

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

5) 我们只需要年份有序列表的第一个条目,我们使用 head() 函数;

6) 我们还不能使用这个值,否则 MDX 会为我们选择的 [Anno] 的值计算事实表中的条目,所以我们用 setToStr() 将其转换为字符串;

7) 值仍然很脏,因为字符串也有层次结构,所以我们使用 left() 和 right() 函数清理它(一年总是由 4 个字符组成)。

这是一个有点大的功能,但这是唯一对我有用的功能:)

于 2014-11-13T13:38:39.640 回答