Как построить запрос диапазона дат, когда - не все даты существуют в иерархии? - PullRequest
0 голосов
/ 23 ноября 2018

Впервые в MDX и унаследовал приложение, используя следующее для извлечения последних 7 рабочих дней.

Обратите внимание, что фактические даты генерируются динамически.

WHERE  ( [DimCalendar].[WorkDayHierarchy].[WorkDate].&[2016-03-25T00:00:00]
: [DimCalendar].[WorkDayHierarchy].[WorkDate].&[2016-03-26T00:00:00].lag(6)
)

Я ожидал, что он будет использовать предыдущие 7 рабочих дней:

  • 2016-03-17 до 2016-03-25

Но вместо этого он использует будущее даты

  • 2016-03-25 до последняя дата в DimCalendar

Из того, что я прочитал, это потому, что 2016-03-26 не существует в иерархии, поэтому конечный диапазон становится NULL, что объясняет будущие даты..

[WorkDate].&[2016-03-25T00:00:00] : NULL

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

Я пытался использовать <= и FILTER, но продолжаю получать ошибки преобразования.С простым SQL это было бы легко.Я мог бы просто написать:

WHERE [WorkDate] >= '2016-03-17' 
AND   [WorkDate] <= '2016-03-25'

Любые идеи, что эквивалентный фильтр будет в MDX?

1 Ответ

0 голосов
/ 25 ноября 2018

Быстрое исправление может быть

ГДЕ ([DimCalendar]. [WorkDayHierarchy]. [WorkDate]. & [2016-03-25T00: 00: 00] .lag (7): [DimCalendar].[WorkDayHierarchy]. [WorkDate]. & [2016-03-25T00: 00: 00]) Но это будет работать только в том случае, если в иерархии находится прошедшая дата, что в данном случае в 2016-03-25.

Редактировать: на основе приведенной ниже проблемы

/// Запрос без использования строгих имен.(нет &)

select {[Measures].[Internet Order Count] }
on columns,
[Date].[Day of Year].[1]:[Date].[Day of Year].[10]
on rows 
from [Adventure Works]

// Этот запрос фильтруется путем создания значения элемента измерения в качестве значения меры.

WITH 
MEMBER [Measures].[Data Type] AS 
[Date].[Day of Year].CurrentMember.Properties ("Member_Value",TYPED) 
select {[Measures].[Internet Order Count] }
on columns,    
filter ([Date].[Day of Year].[Day of Year],[Measures].[Data Type]<12)
 on rows 
from [Adventure Works]

// Вы также можете попробовать следующее

select 
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} 
on columns, 
filter([Date].[Day of Year].[Day of Year], 
[Date].[Day of Year].currentmember.Properties ("Member_Value",TYPED)
>12 and [Date].[Day of Year].currentmember.Properties ("Member_Value",TYPED)<20) 
on rows 
from 
[Adventure Works]

Редактировать

// это может быть точное решение, которое будет работать для вас

select 
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} 
on columns, 
([Geography].[Country].&[United States]
)
on rows 
from 
[Adventure Works]
where 
filter([Date].[Day of Year].[Day of Year], 
[Date].[Day of Year].currentmember.Properties ("Member_Value",TYPED)
>12 and [Date].[Day of Year].currentmember.Properties ("Member_Value",TYPED)<20) 
...