2014-11-05 5 views
0

나는 내 대학의 교사가 발행 한 데이터 마트를 가지고 있는데, 얼마나 많은 책을 쓴지와 기간을 공개 한 교사 목록을 선택하고 싶습니다. 서적.MDX 쿼리, 이벤트 기간의 처음과 지난 연도를 선택하는 방법

예 교사 - pubblication의 마지막 년 - 책의 수

교사 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].Members, tail(NonEmptyCrossJoin([Autore.default].[Nome].CurrentMember, [Anno.default].[Anno].Members), 1).Item(0).Item(1)) ON ROWS 
from [Pubblicazioni] 
+0

무엇 최대 년 (즉 교사 즉, 가장 최근 년)을 찾기 위해 MAX() 집계를 사용하는 방법에 대한 대신 근무하다 SUM() 집계? –

+0

[WITHY MEMBER [Measures]와 같은 것을 사용하려고했습니다. [TopYear] 최대 ([Anno]. [Anno] .Members) '이고 3, 4, 5와 같은 값을 제공합니다 ... 잘 모르겠습니다. 왜 – Neo87

+0

AGGREGATE() 함수에 대해 읽고 싶을 수도 있습니다.이 함수는 사용자가 수행 한 것과 약간 다릅니다. http://msdn.microsoft.com/en-us/library/ms145524.aspx –

답변

0

내가 마지막으로 함께 절에서 ... 기본적으로 모든 계산 된 구성원 "을 얻을 수있는 방법을 발견 :

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] 

하는 대신 하나의 시도 MEMBER "는 큐브의 정보로 취급됩니다. 내 경우, 내가 최대 ("저자가 일한 년의"xpression) 일 경우 상대 최대 연도에 쓴 책의 수를 줄 것이다. 이를 피하기 위해 Year를 String으로 인쇄하는 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) nonemptycrossjoin와 현재의 저자에 대한 책을 추출 ([리브로] [Titolo] .Members, [Autore] [놈. ] .CurrentMember) 그래서 튜플을 얻을;

2) 올해는 nonemptycrossjoin ([Anno]. [Anno])와 함께 이전 튜플에 가입하게했습니다.회원들);

3) 내 경우에는 DM이 아직 주문되어 있지만 다른 경우에는 함수 순서도 사용해야합니다.

4) 우리는 모든 것을 필요로하지 않으므로 extract (, [Anno])를 사용하여 필요하지 않은 것을 휴지통으로 만듭니다. 이것은 계층 [Anno]의 값만 유지한다는 것을 의미합니다.

5) 우리는 단지 년차 순차 목록의 첫 번째 항목이 필요하며 head() 함수를 사용합니다.

6) 아직 값을 사용할 수 없거나 MDX가 선택한 [Anno] 값에 대해 사실 테이블의 항목을 계산하므로 setToStr();로 문자열로 변환합니다.

7) 값이 여전히 더러 우며 문자열에 hiearchy도 발생하므로 left() 및 right() 함수를 사용하여 정리합니다 (연도는 항상 4 자로 구성됩니다).

그것은 조금 큰 기능입니다, 그러나 이것은 단지 하나의 나를 :)

0

측정을하는 동안 나는이 하나가 교사 [Fazzinga, 베티]의 위대한 노력

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] 

혼란 조금

에 대한 편집을 해요,하지만 쿼리가 작동 중지 반환 할 어떤 형태의 값이나 문자열이 필요합니다. ClosingPeriod가 값이 아닌 멤버를 반환하므로 측정 값이 무효화되는 이유라고 생각합니다.

테스트를 마친되지 다음

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]; 
+0

현재 작동하지 않습니다 ... 그러나 D 아이디어 : D – Neo87

+0

@ Neo87 받고있는 오류는 무엇입니까? – whytheq

+0

몬드리안 오류 : 아무 기능도 서명이 'nonempty (, )와 일치합니다.'어쨌든 새로운 쿼리로 질문을 편집했지만 쿼리를 보았을 때 생각했지만 .currentmember는 작동하지 않습니다. (그리고 [ Measures]. [LastYear] 열에는 책 수를 나에게 줄 수 있습니다. – Neo87