Порядок членов иерархии в естественном порядке

У меня есть куб SSAS со следующими размерами:

Time
    DayName <- Hierarchy

Item
    Description <- Hierarchy

В измерении Measures у меня есть мера для LostAmount.

Я хочу запросить куб, чтобы получить сумму потерянной суммы за день недели. Работает следующий запрос:

select
    except(Time.DayName.members, {Time.DayName.[All]}) on 0,
    except(Item.Description.members, {Item.Description.All}) on 1
from Cube

Но при возврате результатов порядок столбцов не соответствует естественному порядку дней недели (т.е. порядок столбцов Friday, Monday, Sunday etc).

Результаты запроса.

Как я могу иметь столбцы результатов в естественном порядке дней недели, т.е. Monday, Tuesday etc.?


person RePierre    schedule 31.08.2015    source источник
comment
это странно except(Time.DayName.members, {Time.DayName.[All]}) почему бы просто не сделать Time.DayName.DayName ?   -  person whytheq    schedule 04.09.2015
comment
@whytheq, потому что я не знал, что ты можешь это сделать :)   -  person RePierre    schedule 11.09.2015


Ответы (3)


Если вы посмотрите на свой снимок экрана, дни на уровне Time.DayName отсортированы в естественном порядке: это алфавитный порядок имен участников.

SSAS никак не может «знать», какой порядок вам нужен. Я предлагаю добавить в это измерение столбец «Ключ», нумеровать дни в том порядке, в котором вы хотите, и изменить свойство OrderBy атрибута измерения на «Ключ», а не «Имя». (Возможно, у вас уже есть ключ: но OrderBy=Name естественным образом упорядочит членов по их именам).

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

person SebTHU    schedule 31.08.2015

Хотя определенно лучше изменить структуру куба, иногда это неосуществимый вариант. В таких случаях это должно обрабатываться внутри кода MDX (который медленнее). Ниже приведен один из способов.

WITH 
  MEMBER measures.weekdaynumber AS  
    CASE Time.DayName.CURRENTMEMBER 
        WHEN "Monday" THEN 1
        WHEN "Tuesday" THEN 2
        WHEN "Wednesday" THEN 3
        WHEN "Thursday" THEN 4
        WHEN "Friday" THEN 5
        WHEN "Saturday" THEN 6
        WHEN "Sunday" THEN 7
    END

SELECT 
  Order
  (
    Except
    (
      Time.DayName.MEMBERS
     ,{Time.DayName.[All]}
    )
   ,Measures.weekdaynumber
  ) ON 0
 ,Except
  (
    [Item].[Description].MEMBERS
   ,{[Item].[Description].[All]}
  ) ON 1
FROM [Cube];
person SouravA    schedule 02.09.2015
comment
(поднято) Мне нравится эта мера - person whytheq; 04.09.2015

Я нашел обходной путь для проблемы с порядком, определив дополнительные элементы в измерении Measures и выведя их в нужном порядке:

with
member Measures.Monday as 
    sum(Time.DayName.&[Monday], Measures.LostValue)
member Measures.Tuesday as
    sum(Time.DayName.&[Tuesday], Measures.LostValue)
member Measures.Wednesday as
    sum(Time.DayName.&[Wednesday], Measures.LostValue)
member Measures.Thursday as 
    sum(Time.DayName.&[Thursday], Measures.LostValue)
member Measures.Friday as
    sum(Time.DayName.&[Friday], Measures.LostValue)
member Measures.Saturday as
    sum(Time.DayName.&[Saturday], Measures.LostValue)
member Measures.Sunday as
    sum(Time.DayName.&[Sunday], Measures.LostValue)
select
{
    Measures.Monday,
    Measures.Tuesday,
    Measures.Wednesday,
    Measures.Thursday,
    Measures.Friday,
    Measures.Saturday,
    Measures.Sunday
} on 0,
except(Item.Description.members, {Item.Description.[All]}) on 1
from [Cube]
person RePierre    schedule 03.09.2015