为ssas表格

时间:2015-10-22 12:39:18

标签: sql-server ssas powerpivot dax tabular

我正在使用ssas表格(powerpivot),需要设计数据模型并编写一些DAX。 我的关系数据库模型中有4个表:

订单(order_id,order_name,order_type)
点(spot_id,order_id,spot_name,spot_time,spot_price)
SpotDiscount(spot_id,discount_id,discount_value)
折扣(discount_id,discount_name)

一个订单可以包含多个点,但一个点(spot_id 1)只能属于一个订单 一个地方可以包含不同的折扣,每个折扣都有一个discount_value 例如:
订单_1 spot_1 spot_price 10), spot_2 spot_price 20)
  Spot_1 discount_name_1 discount_value 10)和 discount_name_2 discount_value 20)
  Spot_2 包含 discount_name_1 discount_value 15)和 discount_name_3 discount_value 30)

我需要写两个度量:price(sum)和discount_value(average)

如何使用事实表(或两个事实表)正确设计星型模式,以便我在powerpivot多维数据集中可以获得:

如果我选择discount_name_1,我应该得到 order_1与spot_1和spot_2以及order_1级别的价格将具有值50和discount_value = 12,5
如果我选择discount_name_3,我应该得到 order_1只有spot_2,订单级别为20且price_value = 30

2 个答案:

答案 0 :(得分:2)

事实(OrderKey,SpotKey,DiscountKey,DateKey,TimeKey Spot_Price,Discount_Value,...)

DimOrder,DimSpot,DimDiscount等......

TotalPrice:=
SUMX(
    SUMMARIZE(
        Fact
        ,Fact[OrderKey]
        ,Fact[SpotKey]
        ,Fact[Spot_Price]
    )
    ,Fact[Spot_Price]
)

AverageDiscount:=
AVERAGE(Fact[Discount_Value])

事实表是非规范化的,您最终会得到最简单的星型模式。

第一项措施值得一些解释。对于具有多个折扣的任何地点,[Spot_Price]都是重复的,我们会使用简单的SUM()得到错误的结果。 SUMMARIZE()按照传递给它的所有列进行分组,遵循关系(如果需要,我们在这里查看单个表,因此无需遵循)。

SUMX()遍历此表并在其第二个参数中累积表达式的值。 SUMMARIZE()删除了我们的重复[Spot_Price] s,因此我们累计了一个唯一的([OrderKey]和[SpotKey]的唯一组合)。

答案 1 :(得分:0)

你说

  

一个订单可以包含多个点,但只有一个点(spot_id 1)   属于一个订单。

您在该声明上方提供的表定义中不支持这些内容。在表定义中,一个订单只有一个点,但(除非您在spot_id上为Orders添加了唯一索引),每个Spot可以有多个订单。每个Spot也可以有多个折扣。

如果您希望获得单词中描述的关系,则表定义应为:

Orders(order_id, order_name, order_type)
OrderSpot(order_id, spot_id) -- with a Unique index on spot_id)
Spots (spot_id, spot_name, spot_time, price)

或:

Orders(order_id, order_name, order_type)
Spots (spot_id, spot_name, spot_time, order_id, price)

您可以使用Order作为事实表创建ssas多维数据集,在Spot Table中有一个维度。如果您随后添加了SpotDiscount和Discount表及其关系(SpotDiscount为Spot,Discount to SpotDiscount),则您有一个1维。

根据评论编辑

嗯,Fact表有order_id,order_name,order_type

Dimension将由其他3个表组成,并包含您感兴趣的列:可能是spot_name,spot_time,spot_price,discount_name,discount_value。