Как определить вычисляемый показатель в многомерных выражениях на основе атрибута измерения?

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

Данный:

Измерение

  • Дата
  • LedgerLineItem {Charge, Payment, Write-Off, Copay, Credit}

Меры

  • 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 в мою сводную таблицу или нет?


person Shane Delmore    schedule 16.04.2010    source источник


Ответы (3)


Попробуйте СУЩЕСТВУЮЩИЕ:

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'  ;  

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

person Meff    schedule 20.04.2010
comment
Ты жжешь! Это ИМЕННО то, что я искал. - person Shane Delmore; 22.04.2010

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

Вам следует рассмотреть возможность использования 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'  ; 
person mprost    schedule 09.05.2013
comment
АГРЕГАТ по умолчанию возвращает тот же результат, что и СУММА. AGGREGATE на самом деле превосходит SUM, потому что вместе с ним можно использовать другие функции агрегирования. - person SouravA; 21.10.2014

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

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

person ajdams    schedule 19.04.2010
comment
Простая сумма SUM, основанная на типе бухгалтерской книги, работает, за исключением случаев, когда я не хочу включать тип бухгалтерской книги в свою сводную таблицу, что бывает довольно часто. То, что я пытаюсь сделать, - это отобразить общее количество различных типов без необходимости включать типы как отдельные объекты в сводную таблицу, скажем, если я хочу получить более широкое представление о своем бизнесе, например, общее количество начисленных, оплаченных и отработанных часов. . Отработанные часы персонала не распределяются по типу бухгалтерской книги, поэтому необходимость разделения по типу бухгалтерской книги для получения общей суммы начислений и оплаты не является для меня отличным решением во всех случаях, только в отчетах только по конкретной бухгалтерской книге. - person Shane Delmore; 22.04.2010