Измерение даты AdventureWorks показывает разные результаты в зависимости от выбранной иерархии - PullRequest
0 голосов
/ 18 января 2019

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

В первом запросе я использую уровень месяца иерархии пользователей "Date.Calendar".

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount] } ON 0,
    NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   {[Date].[Date].&[20130105]:[Date].[Date].&[20130106]}

И получено - январь 2013 г. -> $ 857 689,91 Результаты

Во втором запросе я использую иерархию атрибутов «Дата.Месяц года».

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount]} ON 0,
    NON EMPTY { [Date].[Month of Year].&[1] } ON 1
FROM    [Adventure Works]
WHERE   { [Date].[Date].&[20130105] : [Date].[Date].&[20130106] }

А получено - январь -> 54 468,46 Результаты

Не могу понять, почему эти два запроса показывают разные результаты.Если используется одно и то же измерение, и данные фильтруются / срезаются на самом любимом уровне.

Вот значения для каждой из этих дат.

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount]} ON 0,
    NON EMPTY { [Date].[Calendar].[Date] } ON 1
FROM    [Adventure Works]
WHERE   { [Date].[Date].&[20130105] : [Date].[Date].&[20130106] }

5 января 2013 г. $ 32 681,44

6 января 2013 г. $ 21 787,02

Результат

Общая стоимость этих двух дат равна результату второго запроса - 54 468,46

Я понимаю, что в первом запросе это иерархия пользователей, а во втором запросе это иерархия атрибутов из измерения Date, но я не могу понять, какое правило (правила) указывает для вычисления этих значений по-разному.

Если бы кто-то мог объяснить эту логику - это было бы очень полезно.Любая ссылка на некоторый ресурс, который объясняет эту логику, также может помочь.

Кстати: я создал простой куб с простым измерением даты, который состоит только из иерархий атрибутов (дата, месяц, год), и он все еще работает как впервый запрос, поэтому не понятно, почему он так себя ведет.

1 Ответ

0 голосов
/ 27 января 2019

Я исследовал причину этого поведения, и я думаю, что выяснил причину. Приведенное ниже объяснение основано на книге «пошаговые инструкции 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] 

Результат. enter image description here

Обратите внимание, что календарный год, семестр и квартал показывают значения не по умолчанию. Но мы никогда не использовали их. Это показывает, что перевод пользовательской иерархии выполняется в базовые иерархии атрибутов. Теперь посмотрите на Календарь, он все еще показывает «Весь период». Так как это было проигнорировано. Теперь, если вы добавите предложение 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]}

Результат: enter image description here

Обратите внимание, что на этот раз вместо разрешения иерархии пользователей использовалось разрешение одного члена. Теперь это поведение может быть связано с тем, что один перевод дает «Весь период», а другой дает член, следовательно, член выиграл.

Чтобы подтвердить это, я внес изменения в свой образец 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]}

Результаты: enter image description here

...