Как группировать и фильтровать по одному измерению в 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