Как группировать и фильтровать по одному измерению в MDX

Я хочу создать диаграмму с полосой для каждого месяца и некоторые меры.

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

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

Это возможно с MDX, и если это так, как должен выглядеть запрос?

3 ответа

Решение

Создайте второе измерение времени, используя виртуальное измерение исходного измерения. Используйте одно измерение в ГДЕ, а другое в SELECT.

Это часто случается в любом случае, если некоторые люди хотят "деловое время" кварталов и периодов, а другие предпочитают месяцы. Или если у вас есть финансовый год, который длится с апреля по апрель.

Вы можете использовать подвыбор. Вы можете найти больше информации на этой странице и этой странице:

Если в предложении оси указан элемент, то этот элемент с его восходящими и дочерними элементами включается в пространство вложенного куба для подвыбора; все не упомянутые одноуровневые элементы в предложении axis или slicer и их потомки отфильтровываются из подпространства. Таким образом, пространство внешнего выбора было ограничено существующими элементами в предложении оси или предложении среза с их восходящими и дочерними элементами, как упоминалось ранее.

Вот пример:

SELECT { [Customer].[Customer Geography].[Country].&[Australia]
       , [Customer].[Customer Geography].[Country].&[United States]
       } ON 1
     ,  {[Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount]} ON 0
  FROM ( SELECT {[Customer].[Customer Geography].[Country].&[Australia]
                 , [Customer].[State-Province].&[WA]&[US]} ON 0
           FROM [Adventure Works]
        )

Результат будет содержать одну строку для Autralia и еще один для United States, С помощью подпункта я ограничил значение United Stated к Washington государство.

Я нашел способ сделать это с Мондрианом так:

WITH MEMBER [Measures].[Units Shipped2] AS
SUM
(
 {
  exists([Store].[Store Country].currentmember.children,{[Store].[USA].[WA],[Store].[USA].[OR]})
 },[Measures].[Units Shipped]
)
MEMBER [Measures].[Warehouse Sales2] AS
SUM
(
 {
  exists([Store].[Store Country].currentmember.children,{[Store].[USA].[WA],[Store].[USA].[OR]})
 },[Measures].[Warehouse Sales]
)
SELECT 
{[Measures].[Units Shipped2],[Measures].[Warehouse Sales2]} ON 0,
NON EMPTY [Store].[Store Country].Members on 1
FROM [Warehouse]

Я не уверен, будет ли фильтрация выполняться в SQL, как показано ниже, и даст хорошую производительность или будет выполняться локально

select Country, sum(unit_shipped)
where state in ('WA','OR' )
group by Country 
Другие вопросы по тегам