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]

しかし、昨年のフィールドは常に無効です。ClosingPeriod の 2 番目の部分を [Measures].[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]
4

2 に答える 2

0

ようやく取得方法が見つかりました... ネイティブでは、"WITH MEMBER" 句内のすべての計算メンバーは、キューブの情報として扱われます。私の場合、 max("著者が働いていた年数の表現") を実行すると、相対的な最大年に彼が書いた本の数が得られます。これを避けるために、年を文字列 ([Hyerarchie].[Level].[Value] など) として出力する SetToStr() という構造があります。文字列は、 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) 空でない crossjoin([Libro].[Titolo].Members,[Autore].[Nome].CurrentMember) で現在の著者の本を抽出するので、タプルを取得します。

2) 年を空でない crossjoin([Anno].[Anno].Members,); で前のタプルに結合させます。

3) 私の場合、DM はまだ 1 年間注文されています。それ以外の場合は、関数の注文も使用する必要があります。

4) そのすべてが必要ないので、extract(,[Anno]) を使用して不要なものを破棄します。これは、階層 [Anno] の値のみを維持することを意味します。

5) 年の順序付けられたリストの最初のエントリが必要なだけであり、head() 関数を使用します。

6) 値をまだ使用できないか、MDX が選択した [Anno] の値のファクト テーブル内のエントリをカウントするため、setToStr() で文字列として変換します。

7) 値はまだ汚れています。文字列にも階層があるため、left() および right() 関数を使用してクリーンアップします (年は常に 4 文字で構成されます)。

それは少し大きな機能ですが、これは私のために働いた唯一のものです:)

于 2014-11-13T13:38:39.640 に答える
0

メジャーには、何らかの形式の値または文字列が返される必要があります。それが、ClosingPeriod が値ではなくメンバーを返すため、メジャーが void を返す理由だと思います。

以下はテストされていません。

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 に答える