SSAS MDX计算-基于组值的总和

时间:2020-01-28 16:28:39

标签: ssas mdx cube calculation measure

我在一家旅馆公司工作,并且我已经为每个客人设置了一个停留时间粒度的事实表,例如如果一位客人住了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 个答案:

答案 0 :(得分:1)

您的事实表很不错,除了带有客房总数的列。事实行位于粒度级别“房间”,但是房间总数位于粒度级别“整个酒店”。 (您可以想象一个“房地产资产”层次结构维度,假设您没有一个维度:

酒店 地板 房间 )

可能的解决方案:

  1. 在“日期”维度的“天”级别(严格来说,是“夜”级别)添加“房间数”。这将与COUNT(当天住宿的客人)相称。您甚至可以调整此数字以反映例如在特定时期内正在维修的房间。
  2. 您可以实现“房间”维度,并将每个客人的Fact_NightStayed分配给一个房间。然后创建一个技术上称为“人数”表的表,就像Fact_NightStayed一样。但是此表将是“ roomcount”表:一行指示在特定日期存在一个房间(或者,如果您决定,该房间存在并且可以使用,即未损坏/正在维修) 。将该表预先填充为每个日期每个房间一行,直到将来直到您决定的日期为止(这将是每年的刷新过程)。然后,将Fact_NightStayed加入Fact_RoomCount,您的度量将为COUNT(NightStayed)/ COUNT(RoomCount)。

当心随着时间的推移聚合此度量(无论您如何实现):从“日期”叶级别到“日期”层次结构的聚合函数本身应该是AVG而不是SUM。