Я исследовал причину этого поведения, и я думаю, что выяснил причину. Приведенное ниже объяснение основано на книге «пошаговые инструкции SQL SERVER 2008 MDX», стр. 51–58 (особенно об избежании конфликтов ссылок).
Ваша проблема - типичная проблема конфликта ссылок. В MDX иерархия не может использоваться более одного раза в данном кортеже, но если вы используете иерархию USER и лежащую в ее основе иерархию атрибутов, вы, по сути, обойдете эту проверку. Это то, что произошло в вашем запросе
В первом запросе вы используете Иерархию пользователей
[Дата]. [Календарь]. [Месяц]. & [2013] & 1
В MDX иерархия пользователей переводится в иерархии атрибутов. В вашем первом запросе
ВЫБРАТЬ
NON EMPTY {[Measures]. [Internet Sales Amount]} ON 0,
NON EMPTY {[Date]. [Calendar]. [Month]. & [2013] & 1 } ON 1
ОТ [Приключенческие работы] ГДЕ
{[Дата] [Дата] и [20130105].... [Date] [Дата] и [20130106]}
вы используете Иерархию пользователей "[Дата]. [Календарь]. [Месяц]. & [2013] & 1 ", которая на последнем уровне имеет значение "[Дата]. [Дата]] ». Затем в предложении where для фильтрации используется та же иерархия атрибутов «[Date]. [Date]». Поскольку в иерархии USER вы не использовали конечный уровень, следовательно, вы указали частичный адрес, поэтому члены и его предки разрешены. Все потомки игнорируются в переводе. Посмотрите на приведенный ниже запрос (это основано на вашем первом запросе, я намеренно удалил предложение where).
with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM [Adventure Works]
Результат.
Обратите внимание, что календарный год, семестр и квартал показывают значения не по умолчанию. Но мы никогда не использовали их. Это показывает, что перевод пользовательской иерархии выполняется в базовые иерархии атрибутов. Теперь посмотрите на Календарь, он все еще показывает «Весь период». Так как это было проигнорировано.
Теперь, если вы добавите предложение where обратно, Дата по-прежнему показывает «Весь период», есть две причины
1) Потому что это было проигнорировано в переводе иерархии пользователей,
2) Вы использовали диапазон где. Если вы замените свой кортеж оси строк на ваш кортеж where, он все равно будет показывать «All Period» в качестве диапазона. Однако для решения этой проблемы потребуется всего две даты.
Исходя из этого, при решении вашего запроса у него было два перевода для иерархии атрибутов Date, один из которых сказал, что игнорирует его на основе иерархии пользователей, а другой - диапазон. Вот где из-за конфликта результат неверен.
Теперь давайте рассмотрим запрос, который вы дали мне в своем комментарии ранее
with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM [Adventure Works]
WHERE {[Date].[Date].&[20130105]}
Результат:
Обратите внимание, что на этот раз вместо разрешения иерархии пользователей использовалось разрешение одного члена. Теперь это поведение может быть связано с тем, что один перевод дает «Весь период», а другой дает член, следовательно, член выиграл.
Чтобы подтвердить это, я внес изменения в свой образец AdventureWorks. Иерархия атрибутов Date основана на столбце «Простая дата». Я выставил «Простую дату» как отдельный атрибут и обработал свой куб.
Посмотрите на запрос "Simple Date" и результаты.
with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM [Adventure Works]
WHERE
--{[Date].[Date].&[20130105]}
{[Date].[Simple Date].&[20130105]:[Date].[Simple Date].&[20130106]}
Результаты: