Как определить вычисляемую меру в MDX на основе атрибута измерения? - PullRequest
5 голосов
/ 16 апреля 2010

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

Дано:

Размер

  • Дата
  • LedgerLineItem {Начисление, Оплата, Списание, Доплата, Кредит}

Меры

  • LedgerAmount

Отношения
* LedgerLineItem - вырожденное измерение FactLedger

Если я разбиваю LedgerAmount по LedgerLineItem.Type, я легко вижу, сколько списано, оплачено, кредит и т. Д., Но когда я не разбиваю его по LedgerLineItem.Type, я не могу легко добавить кредит, оплаченный, кредит, и т. д. в сводной таблице. Я хотел бы создать отдельные вычисляемые меры, которые суммируют только конкретные типы (или несколько типов) фактов главной книги.

Примером желаемого вывода будет:

| Year  | Charged | Total Paid | Amount - Ledger |
| 2008  | $1000   | $600       | -$400           |
| 2009  | $2000   | $1500      | -$500           |
| Total | $3000   | $2100      | -$900           |

Я попытался создать рассчитанную меру несколькими способами, и каждый из них работает в некоторых обстоятельствах, но не в других. Теперь, прежде чем кто-то скажет сделать это в ETL, я уже сделал это в ETL, и он работает просто отлично. Что я пытаюсь сделать, чтобы научиться лучше понимать MDX, так это выяснить, как продублировать то, что я сделал в ETL в MDX, так как пока я не могу этого сделать.

Вот две попытки, которые я сделал, и проблемы с ними. Это работает только тогда, когда тип главной книги находится в сводной таблице. Он возвращает правильное количество записей в бухгалтерской книге (хотя в этом случае оно совпадает с [сумма - бухгалтерская книга], но когда я пытаюсь удалить тип и просто получить сумму всех записей в бухгалтерской книге, он возвращает неизвестное.

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS CASE WHEN ([Ledger].[Type].currentMember = [Ledger].[Type].&[Credit]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Paid])
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Held Money: Copay])
THEN [Measures].[Amount - ledger] 
ELSE 0
END 
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ; 

Это работает только тогда, когда тип главной книги отсутствует в сводной таблице. Он всегда возвращает общую сумму платежа, что неверно, когда я выполняю разрезание по типу, так как я ожидаю увидеть только кредитную часть в рамках кредита, оплаченную часть в условиях недоплаты, 0 долларов США в счет и т. Д.

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS sum({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay])}
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ;  

Есть ли способ сделать так, чтобы это возвращало правильные числа независимо от того, включен ли Ledger.Type в мою сводную таблицу или нет?

Ответы [ 3 ]

7 голосов
/ 20 апреля 2010

Попробуйте EXISTING:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS sum(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay])})
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ;  

Следует обратить внимание на участников в игре.

1 голос
/ 09 мая 2013

Не могу комментировать ответ Меффа, поэтому я отправлю свой.

Вам следует рассмотреть возможность использования Aggregate вместо Sum, поскольку результаты не всегда могут быть теми, которые вы ожидаете, используя Sum:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS Aggregate(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay])})
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ; 
0 голосов
/ 20 апреля 2010

Я предполагаю, что в измерении Ledger есть ключ внутри FactLedger, но проблема, связанная с тем, что он не работает правильно с первым вычисленным элементом MDX, заставляет меня поверить, что вы, возможно, захотите переосмыслить иерархии для этого.

Тогда сработает простой SUM, основанный на типе вашей бухгалтерской книги, имеет ли это смысл?

...