Вопрос:
Я пытаюсь создать меру в MDX чтобы получить первый день в выбранный период (у меня есть измерение даты YMD). Я использую функцию EXISTING для получения выбранных элементов. Он работает нормально, если я выбираю только один элемент измерения в элементе таблицы сводной таблицы Excel. Однако, как только я выберу несколько членов (пример: 2012 и 2013 вместе), функция EXISTING работает не так, как ожидалось.
Я создал еще одну меру для отладки и просмотра того, что происходит. Мера определяется как:
SetToStr (СУЩЕСТВУЕТ ([Дата]. [Дата YMD]. [Год].members))
Если у меня выбран только один элемент измерения, это отлично работает, я получаю это обратно:
{[Дата]. [Дата YMD]. [Все]. [2013]}
Однако, как только я выбираю 2012 и 2013 вместе, я получаю список всех членов измерения назад:
{[Date].[Date YMD].[All].[N/A],[Date].[Date YMD].[All].[2007],[Date].[Date YMD].[All].[2008],[Date].[Date YMD].[All].[2009],[Date].[Date YMD].[All].[2010],[Date].[Date YMD].[All].[2011],[Date].[Date YMD].[All].[2012],[Date].[Date YMD].[All].[2013],[Date].[Date YMD].[All].[2014]}
Функция EXISTING работает только при выборе одного элемента?
–
Обновить:
Возможно, я не был достаточно ясен в оригинальном посте. Проблема, с которой я столкнулся, – это получить первый и последний член даты, если размер даты фильтруется (в фильтре таблицы сводной таблицы Excel), и в фильтре выбраны несколько членов даты (например, когда годы 2012 и 2013 выбраны вместе),
Я попытался использовать это решение здесь: http://bimic.blogspot.com/2011/07/mdx-rewrite-query-with-currentmember.html, но безуспешно.
Сейчас я создал две меры:
- Первый день:
HEAD( DESCENDANTS( [Date].[Date YMD].CURRENTMEMBER, [Date].[Date YMD].[Day] ), 1 ).ITEM(0).member_value
- Первый день Несколько лет
MIN(EXISTING [Date].[Date YMD].[Year].members, [Measures].[First Day Single])
К сожалению, я не могу включить скриншот напрямую. Вы можете увидеть его по этой ссылке: http://social.msdn.microsoft.com/Forums/getfile/446659
Как вы можете видеть, меры работают, когда в фильтре сводной таблицы выбран один год, но не работают, когда вы выбираете более одного года.
Лучший ответ:
Существует обходной путь для вашей проблемы, описанной здесь: excel-2007.aspx. Но, как пишет автор (один из разработчиков SSAS), “решение не является ни элегантным, ни эффективным”. Во всяком случае, для добавления в куб требуется еще одна группа мер и хранимая процедура для записи.
Ответ №1
В моем кубе и через студию управления я могу написать сценарий, подобный этому, для создания мер, возвращающих числовые значения в зависимости от первого дня и последнего дня каждого месяца:
WITH SET [Last12Months] AS TAIL ( [Date].[Date — Calendar Month].[Calendar Month].members, 12) MEMBER [Measures].[FirstDay] AS HEAD( DESCENDANTS( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ), 1 ).ITEM(0).member_value MEMBER [Measures].[LastDay] AS TAIL( DESCENDANTS( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ), 1 ).ITEM(0).member_value SELECT {[Measures].[FirstDay],[Measures].[LastDay]} ON 0, [Last12Months] ON 1 FROM [MyCube]
Мы используем Office 2010 но с помощью OLAP Pivottables extensions я могу добавить следующие две меры для моей стратегии:
1. [Measures].[FirstDay]
HEAD( DESCENDANTS( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ), 1 ).ITEM(0).member_value
2. [Measures].[LastDay]
TAIL( DESCENDANTS( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ), 1 ).ITEM(0).member_value
Теперь, что бы я ни использовал в рядах, я получаю правильный ответ от стержня:
РЕДАКТИРОВАТЬ
Если я манипулирую с центром, чтобы наше измерение даты находилось в сводном фильтре, а затем переходим к мультивыборке 2013 и 2014, кажется, что “mdx”, который использует excel, выглядит следующим образом:
WITH MEMBER [Measures].[FirstDay] as HEAD ( DESCENDANTS ( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ) , 1 ).ITEM( 0 ).member_value MEMBER [Measures].[LastDay] as TAIL ( DESCENDANTS ( [Date].[Date — Calendar Month].CURRENTMEMBER, [Date].[Date — Calendar Month].[Calendar Day] ) , 1 ).ITEM( 0 ).member_value SELECT { [Measures].[FirstDay], [Measures].[LastDay] } ON COLUMNS FROM ( SELECT ({ [Date].[Date — Calendar Month].[Calendar Year].&[2012], [Date].[Date — Calendar Month].[Calendar Year].&[2013] }) ON COLUMNS FROM [OurCube] )
Я думаю, что контекст функции CURRENTMEMBER в пользовательских мерах этого скрипта будет потерян из-за подвыборки.