SSAS MDX Расчет - Сумма, основанная на значении группы - PullRequest
2 голосов
/ 28 января 2020

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

То, что я пытаюсь сделать, - это определить показатель процента занятости (забронированные номера разделены на свободные номера).

У меня есть столбец в таблице фактов, в котором указано, сколько номеров в отеле , но просто суммирование этого значения не работает, потому что тогда оно просто умножает количество комнат на количество гостей. Поэтому мне нужно подвести итоги общего количества гостей, а затем разделить их на количество номеров, которые есть в данном отеле. Имеет ли это смысл?

[Меры]. [На книгах] / [Меры]. [Доступные комнаты]

SQL для этого будет:

SELECT  stay.PropertyKey, prop.RoomsAvailable, stay.StayDateKey, COUNT(stay.Confirmation) AS Confirmation,
        CAST(COUNT(stay.Confirmation) AS DECIMAL(13,9)) / CAST(prop.RoomsAvailable AS DECIMAL(13,9)) AS OccupancyPercentage
    FROM dbo.FactStayNight stay
    INNER JOIN
    (
        SELECT DISTINCT PropertyKey, RoomsAvailable
            FROM dbo.FactStayNight
    ) prop
        ON stay.PropertyKey = prop.PropertyKey
            GROUP BY stay.PropertyKey, stay.StayDateKey, prop.RoomsAvailable

1 Ответ

1 голос
/ 28 января 2020

Ваша таблица фактов хорошая, кроме колонки с общим количеством комнат. Строка фактов находится на уровне детализации "Комната", но общее количество номеров находится на уровне детализации "Вся гостиница". (Вы можете представить себе иерархическое измерение «Активы недвижимости», если у вас его нет:

Номер на этаже отеля)

Возможные решения:

  1. Добавить «количество комнат», доступное в измерении «Дата», на уровне «День» (строго, уровень «Ночь»). Сумма будет соизмерима с COUNT (гости, проживающие в этот день). Вы можете даже изменить это число, чтобы отразить, например, ремонтируемые помещения в определенные периоды.
  2. Вы можете реализовать измерение Комнаты, когда Fact_NightStayed каждого гостя будет назначен Комнате. Затем создайте так называемую таблицу «численность персонала», такую ​​же, как ваша Fact_NightStayed. Но эта таблица будет таблицей «roomcount»: строка указывает, что комната существует в определенный день (или, если вы решите, что комната существует и может использоваться, то есть не сломана / ремонтируется) . Предварительно заполняйте эту таблицу одной строкой на комнату на дату в будущем до даты, которую вы решите (это будет ежегодный процесс refre sh). Затем, присоединяя Fact_NightStayed к Fact_RoomCount, вашей мерой будет COUNT (NightStayed) / COUNT (RoomCount).

Следите за агрегацией этой меры (как бы вы ее не применяли) с течением времени: сама функция агрегации из Дневной лист уровня иерархии Дата должен быть AVG, а не SUM.

...