2011-01-31 4 views
0

Я хотел бы иметь возможность Rollup подсчета обязательств к продукту в течение многих лет -MDX Count с течением времени (лет - не в течение года)

Данные для новых обязательств в каждый году выглядит следующим образом:

Year | Count of new commitments | (What I'd like - count of new commitments to date) 
1986 4  4 
1987 22  26 
1988 14  40 
1989 1  41 

Я знаю, что в течение года вы можете сделать год на сегодняшний день, месяц до даты и т.д., но мне нужно сделать это в течение нескольких лет.

MDX, который дает мне первые 2 столбца является (на самом деле просто - но я не знаю, куда идти отсюда):

select [Measures].[Commitment Count] on 0 
, [Date Dim].[CY Hierarchy].[Calendar Year] on 1 
from [Cube] 

Любая помощь будет большим

ответ

1

В MDX-то вдоль линии:

with member [x] as sum( 
    [Date Dim].[CY Hierarchy].[Calendar Year].members(0) : [Date Dim].[CY Hierarchy].currentMember, 
    [Measures].[Commitment Count] 
) 

select [x] on 0, [Date Dim].[CY Hierarchy].[Calendar Year] on 1 from [Cube] 
+0

спасибо Марк - Я получил эту работу, но есть вопрос - существует ли способ генерации иерархии расчетных дат? Поэтому я могу использовать его как в иерархии CY, так и в иерархии FY? От игры я могу заменить первую дату в диапазоне с помощью NULL, но вам нужно указать иерархию для второй даты. –

+0

Сэм, «generic: значение, берущее« иерархию », которое в настоящее время используется на оси, я думаю. Если да, то вы можете попробовать с помощью функции Axis получить эту иерархию из кортежей оси (1). Какой сервер OLAP вы используете? В icCube мы могли бы использовать объявленную функцию. –

+0

Я задал еще один вопрос: http://stackoverflow.com/questions/4858350/mdx-count-over-time-without-specific-hierarchy об этом (так как это немного другой вопрос), но мы просто используем службы анализа ms на sql 2008 - я очень новичок в MDX/OLAP, поэтому все еще теряю некоторые основные понятия. –

0

Используйте общий табличное выражение:

with sums (year,sumThisYear,cumulativeSum) 
as (
    select year 
     , sum(commitments) as sumThisYear 
     , sum(commitments) as cumulativeSum 
     from theTable 
    where year = (select min(year) from theTable) 
    group by year 
    union all 
    select child.year 
     , sum(child.commitments) as sumThisYear 
     , sum(child.commitments) + parent.cumulativeSum as cumulativeSum 
     from sums par 
     JOIN thetable Child on par.year = child.year - 1 
    group by child.year,parent.cumulativeSum 
) 
select * from sums 

там есть немного «трюк» в там группировку по parent.cumulativeSum. Мы знаем, что это будет одинаковое значение для всех строк, и нам нужно добавить его в sum (child.commitments), поэтому мы группируем его, чтобы SQL Server позволил нам обратиться к нему. Возможно, это можно очистить, чтобы удалить то, что можно назвать «запахом», но оно будет работать.

Предупреждение: 11:15 вечера, где я, написанный с верхней части головы, может потребоваться настройка или два.

EDIT: забыл группу, в предложении якоря, добавил, что в

Смежные вопросы