Расчет MDX имеет неправильный порядок приоритета - PullRequest
1 голос
/ 27 октября 2010

У меня проблема с запросом MDX, и я думаю, что он сводится к порядку приоритета между вычислением агрегата и вычисляемого члена.

Позвольте мне начать с базовых данных, которые вращаются вокругоценка (которая имеет дату и некоторые другие данные, такие как тип элемента, схема - и, что особенно важно, для этого вопроса; коэффициент загрузки) и соответствующее значение.

Данные

Таблица оценки

Id | Valuation Date | Member Type | Scheme   | Loading Factor
=============================================================
1  | 2010-01-01     | TypeA       | Scheme X | 0.02
2  | 2010-01-01     | TypeB       | Scheme X | 0.02
3  | 2010-01-01     | TypeA       | Scheme Y | 0.02
4  | 2010-01-01     | TypeB       | Scheme Y | 0.02

Таблица ValuationValue

ValuationId | Value
====================
1           | 1000.0
2           | 2000.0
3           | 3000.0
4           | 4000.0

При загрузке в куб имеет измерение Valuation с атрибутами MemberTypeСхема и дата.И куб с группой мер ValuationValue, содержащей меру значения, и группой мер оценки, содержащей коэффициент загрузки, например:

Cube
 -Measure Groups
  - Valuation
    |_Loading Factor
  - ValuationValue
    |_Value
 - Dimensions
  - Valuation
    |_MemberType
    |_Scheme
    |_Date

Вопрос

Коэффициент загрузки используется для загрузки значения, представьте себеэто как налог, поэтому 0,02 означает «сумма загрузки составляет 2% от стоимости».При возврате значения из запроса мне нужно также рассчитать сумму, на которую можно загрузить это значение.Типичный запрос может выглядеть следующим образом:

SELECT
{
 [Measures].[Value] 
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

Это вернет 2 строки, и, как вы можете видеть, сравнивая с данными выше, он корректно суммирует через memberType:

Scheme   | Value
=================
Scheme X | 3000.0
Scheme Y | 7000.0

Теперь, еслиЯ пытаюсь рассчитать коэффициент загрузки в этом запросе, все идет не так - я покажу.Учитывая следующий запрос:

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

Я получаю результат

Scheme   | Value  | Loading Value
=================================
Scheme X | 3000.0 | 120.0
Scheme Y | 7000.0 | 280.0

По сути, происходит то, что он суммирует мой коэффициент загрузки, а затем умножает его на сумму моих значений(Первая строка выше должна быть 1000 * 0.02 + 2000 * 0.02 = 60. Вместо этого она вычисляет 3000 * 0.04 = 120).

Это, конечно, надуманный пример, моя фактическая структура немного сложнее - но я думаю, что это демонстрирует проблему.У меня сложилось впечатление, что вычисляемый элемент в приведенном выше примере должен появляться построчно, а не в конце агрегации моего показателя Value.

Спасибо за любые ответы.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2010

Я не уверен, что полностью следую вашему примеру, но вы можете попробовать использовать SOLVE_ORDER и SCOPE_ISOLATION для управления порядком вычислений.

Например,

 WITH
 MEMBER [Measures].[Custom Calculation] AS
   '([Measures].[Sales Count] - [Measures].[Unit Returns])',
   SOLVE_ORDER = 65535, SCOPE_ISOLATION = CUBE
 SELECT
 {[Measures].[Custom Calculation]} ON COLUMNS,
 NON EMPTY [Time].[YQMD].[Day].AllMembers ON ROWS
 FROM [Waremart]
0 голосов
/ 02 ноября 2010

Оказалось, что ДЕЙСТВИТЕЛЬНО легко.

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
WITH MEMBER [Measures].[Total Loading Value]
AS
SUM (
  EXISTING [Valuation].[Id].[Id],
  [Measures].[Loading Value]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Measures].[Total Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube
0 голосов
/ 29 октября 2010

Ваши [Меры]. [Коэффициент загрузки] - Как это установить, это сумма?

Вычисляемые элементы обычно выполняются в соответствии с возвращаемыми строками, если я помню - если вы не укажете иначе.

Если вам нужен пример, взгляните на выходные данные мастера конвертации валют - Это делает нечто похожее с помощью команды LEAVES - Это необходимо сделать в сценарии MDX как команду SCOPE'd.

Учитывая ваше описание, код может быть что-то вроде:

CREATE MEMBER [Measures].[Loading Value] AS NULL

Scope( { [Measures].[Loading Value] } );   

    Scope( Leaves([Valuation]) );                                         

            This = [Measures].[Value] * [Measures].[Loading Factor]                                  
            Format_String(This) = "#,##0.00;-#,##0.00";                                                                                

    End Scope;   
End Scope;  
...