Сортировка и разбиение по страницам в запросе MDX (MS Analysis Services) - PullRequest
0 голосов
/ 12 мая 2009

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

SELECT NON EMPTY
(
    Hierarchize
    (
        {
            DrilldownLevel
            (
                {
                    [T DAT Article].[Ar ID].[All]
                }
            )
        }       
    ) 

)

DIMENSION PROPERTIES PARENT_UNIQUE_NAME,
[T DAT Article].[Ar ID].[Ar ID].[Ar Key],
[T DAT Article].[Ar ID].[Ar ID].[Ar LongName] 
ON COLUMNS 
FROM [Catalog_2009]

WHERE 
(
    [T DAT Structure].[St St ID FK].&[193066], -- specific article-category node
    [T DAT Firm].[Fi ID].&[86] -- specific manufacturer
) 

CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS

Теперь я хочу улучшить этот запрос, чтобы он поддерживал разбиение на страницы и сортировку. Значение я могу поставить:

  • Индекс страницы (например, 0)
  • Размер страницы (например, 30)
  • Сортировать столбец (например, Ar LongName)
  • Направление сортировки (по возрастанию)

Какой подход мне выбрать? Я посмотрел на предложение Subset и order . Но они в основном ограничивали результаты из части «иерархии» запроса, то есть они обрезали иерархии вместо конечного результата.

Может кто-нибудь подсказать, как заставить работать пейджинг и сортировку?

Ответы [ 2 ]

1 голос
/ 19 мая 2009

Сортировка - это боль в MDX, или, по крайней мере, я всегда так к этому относился. Если ваш запрос содержит только одно измерение в строках и одно в столбцах, это значительно упростит жизнь.

Ключевое слово ORDER может быть применено к набору, и вам просто нужно дать ему номер для сортировки и указать, какой путь следует использовать с ASC или DESC.

Проблема ASC или DESC становится запутанной, поскольку вы также можете указать BASC или BDESC. «B» означает «разбить» и говорит, хотите ли вы, чтобы строки (или столбцы) были отсортированы в их иерархических группах, или вы хотите полностью разбить иерархию при сортировке и полностью изменить порядок строк.

Вот простой пример

ORDER({[Time].[Month].members}, [Measures].[Gross Sales], BASC)

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

0 голосов
/ 06 июня 2019

Взгляните на пример ниже

Я перечислил Продукты в порядке убывания продаж

select 
{[Measures].[Internet Sales Amount]}on 0,
order ({[Product].[Product].[Product]},
[Measures].[Internet Sales Amount],desc
)on 1 
from 
[Adventure Works]

Результат

enter image description here

Теперь давайте рассмотрим их. Я создаю страницу из 10 строк, Страница 1 -

select 
{[Measures].[Internet Sales Amount]}
on 0,
subset(
order 
(
{
[Product].[Product].[Product]
},[Measures].[Internet Sales Amount],desc
)
,0,10)
on 1 

from 
[Adventure Works]

Результат

enter image description here

Сейчас Страница 2

select 
{[Measures].[Internet Sales Amount]}
on 0,
subset(
order 
(
{
[Product].[Product].[Product]
},[Measures].[Internet Sales Amount],desc
)
,10,10)
on 1 

from 
[Adventure Works]

Результат

enter image description here

...