我有一本来自我大学教师的出版物datamart,我想选择一份教师名单,列出他们写了多少本书,并在他们宣传书籍的过程中。
实施例 老师 - 去年的出版 - 书籍数量
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]更改ClosingPeriod的第二部分。[Unita(libri)]它也是空的......我应该如何实现该查询?
我有点困惑修改
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]
答案 0 :(得分:0)
测量需要某种形式的值或字符串来返回,我认为这就是为什么你的度量返回无效,因为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];
答案 1 :(得分:0)
我终于找到了获得它的方法......本质上,“WITH MEMBER”子句中的每个计算成员都被视为立方体的信息。在我的情况下,如果我做max(“当作者工作了几年的时间”),它将给出他在相对最大年份写的书数。为了避免这种情况,有一个名为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)为非当前作者提取书籍([Libro]。[Titolo]。成员,[Autore]。[Nome] .CurrentMember)所以我得到了元组;
2)我让年份加入前一个元组与非常交叉连接([Anno]。[Anno] .Members,);
3)在我的情况下,DM已经订购了一年,在其他情况下我们甚至应该使用功能订单;
4)我们不需要所有这些东西,所以我们使用extract(,[Anno])来废弃我们不需要的东西,这意味着我只会维护层次结构的值[Anno];5)我们只需要有序年份列表的第一个条目,我们使用head()函数;
6)我们不能使用该值,或者MDX将计算事实表中我们选择的[Anno]值的条目,因此我们将其转换为字符串with setToStr();
7)值仍然很脏,因为字符串也有hiearchy,所以我们使用left()和right()函数清理它(一年总是由4个字符组成)。
这是一个很大的功能,但这是唯一一个适合我的功能:)