Как определить вычисляемую меру в многомерных выражениях на основе атрибута измерения?
Я хотел бы создать вычисляемую меру, которая суммирует только определенное подмножество записей в моей таблице фактов на основе атрибута измерения.
Дано:
Размерность
- дата
- LedgerLineItem {Начисление, Оплата, Списание, Copay, Кредит}
Меры
- LedgerAmount
Отношения
* LedgerLineItem-вырожденное измерение FactLedger
Если я разобью LedgerAmount на Леджерлинитем.Тип я могу легко видеть, сколько начисляется, выплачивается, кредит и т. д., Но когда я не разбиваю его по LedgerLineItem.Тип I не может легко добавить кредит, оплаченный, кредит и т. д. В сводную таблицу. Я хотел бы создать отдельные вычисляемые меры, которые суммируют только определенный тип (или несколько типов) фактов книги.
Примером желаемого результата может быть:
| Year | Charged | Total Paid | Amount - Ledger |
| 2008 | $1000 | $600 | -$400 |
| 2009 | $2000 | $1500 | -$500 |
| Total | $3000 | $2100 | -$900 |
Я попытался создать вычисленную меру несколькими способами, и каждый из них работает в некоторых обстоятельствах но не в других. Теперь, прежде чем кто-либо скажет сделать это в ETL, я уже сделал это в ETL, и это работает просто отлично. Что я пытаюсь сделать в рамках обучения лучшему пониманию многомерных выражений, так это выяснить, как дублировать то, что я сделал в ETL в многомерных выражениях, поскольку пока я не могу этого сделать.
Вот две попытки, которые я сделал, и проблемы с ними. Это работает только тогда, когда тип книги находится в сводной таблице. Он возвращает правильное количество операций книги (хотя в данном случае это идентично [сумма-книга], но когда я пытаюсь удалить тип и просто получить сумму всех операций книги, он возвращает неизвестный.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' ;
Есть ли какой-либо способ сделать это возвращение правильных чисел независимо от того, то ли дело Леджер.Тип включен в мою сводную таблицу или нет?
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' ;
Должен заставить его обратить внимание на участников в игре.
Не могу прокомментировать ответ Меффа, поэтому я опубликую свой собственный.
Вы должны рассмотреть возможность использования 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' ;
Я предполагаю, что измерение Ledger имеет ключ в FactLedger, но проблема в том, что оно не свертывается правильно с первым вычисляемым членом MDX, заставляет меня полагать, что вы, возможно, захотите пересмотреть иерархию для этого.
Тогда простая сумма, основанная на вашем типе книги, будет работать, имеет ли это смысл?