【请教】SSAS建立Cube中的事实表有属性字段的问题,并使用MDX进行查询
------事实表
CREATE TABLE StdShipCost
(
Customer_level char(12) NOT NULL,
Scenario varchar(8) NOT NULL,
Time_level varchar(12) NOT NULL,
Value FLOAT NOT NULL
)
;
--------维度表
CREATE TABLE TimeLevel
(
Month_level varchar(12) NOT NULL,
Quarter_level varchar(12) NOT NULL,
year_level varchar(12) NOT NULL
)
;
CREATE TABLE CustLevel
(
Store_level char(12) NOT NULL,
Retailer_level char(12) NOT NULL
)
;
可以看到事实表customer_level与time_level字段是与两个维度表进行关联的id,vaule是一个度量值,而scenario是一个属性字段有三种值,分别为fact,budget,forecast。这个字段是String类型的,不能进行聚合,不知道怎么做才能作为一个事实表的度量,这样我使用MDX查询的时候,可以进行where条件的一个切块查询。(如果不考虑ETL的方式重新设计表结构,将此属性作为维度的方式)
----------想要设计一个MDX,比如说下面的查询
select {[Measures].[Product Cost]} on columns,
non empty
{[time].[timehier].[month_level].[199505]}*
{[product].[prodhier].[class_level].[N5YKSZDW59R9].children} on rows
from
[Cube]
where [measures].[scenario].[fact]
谢谢大家了
CREATE TABLE StdShipCost
(
Customer_level char(12) NOT NULL,
Scenario varchar(8) NOT NULL,
Time_level varchar(12) NOT NULL,
Value FLOAT NOT NULL
)
;
--------维度表
CREATE TABLE TimeLevel
(
Month_level varchar(12) NOT NULL,
Quarter_level varchar(12) NOT NULL,
year_level varchar(12) NOT NULL
)
;
CREATE TABLE CustLevel
(
Store_level char(12) NOT NULL,
Retailer_level char(12) NOT NULL
)
;
可以看到事实表customer_level与time_level字段是与两个维度表进行关联的id,vaule是一个度量值,而scenario是一个属性字段有三种值,分别为fact,budget,forecast。这个字段是String类型的,不能进行聚合,不知道怎么做才能作为一个事实表的度量,这样我使用MDX查询的时候,可以进行where条件的一个切块查询。(如果不考虑ETL的方式重新设计表结构,将此属性作为维度的方式)
----------想要设计一个MDX,比如说下面的查询
select {[Measures].[Product Cost]} on columns,
non empty
{[time].[timehier].[month_level].[199505]}*
{[product].[prodhier].[class_level].[N5YKSZDW59R9].children} on rows
from
[Cube]
where [measures].[scenario].[fact]
谢谢大家了
作者: tsinghua_job 发布时间: 2011-03-18
1,你这个所谓的事实表既把他当做ODS表又把他当做FACT表,设计本身就有问题
2,如果非要在这个不合理的设计上做,只能把scenario 再加三个属性值: fact_all, budget_all, forecast_all 用来存储聚合value
2,如果非要在这个不合理的设计上做,只能把scenario 再加三个属性值: fact_all, budget_all, forecast_all 用来存储聚合value
作者: wangfans 发布时间: 2011-03-18
楼主是不懂MDX吧, scenario 只要做成维就行了,既然是三个固定值那就建一个只有三记录的维表, 然后MDX过滤具体的就行了
作者: piliskys 发布时间: 2011-03-18
1,你这个所谓的事实表既把他当做ODS表又把他当做FACT表,设计本身就有问题
2,如果非要在这个不合理的设计上做,只能把scenario 再加三个属性值: fact_all, budget_all, forecast_all 用来存储聚合value
恩 设计是有问题。我也觉得相当有问题!谢谢~
不过,怎么在scenario 上再加三个属性值呢,本身已经是属性l啊?不是很清楚,能不能给出你的设计啊
2,如果非要在这个不合理的设计上做,只能把scenario 再加三个属性值: fact_all, budget_all, forecast_all 用来存储聚合value
恩 设计是有问题。我也觉得相当有问题!谢谢~
不过,怎么在scenario 上再加三个属性值呢,本身已经是属性l啊?不是很清楚,能不能给出你的设计啊
作者: tsinghua_job 发布时间: 2011-03-18
恩 不是很懂啊,就是一个初学者。但是有这样一个需求,我也没办法
我大概明白您的意思,就是更改表的结构式么。将scenario改成int字段关联维度表(dim Scenario)。然后建立维度表比如说
CREATE TABLE DimScenario(
ScenarioKey int IDENTITY(1,1) NOT NULL,
ScenarioName nvarchar](50) NULL,
)
之后插入数据
insert into DimScenario values (1,'fact');
insert into DimScenario values (1,'budget');
insert into DimScenario values (1,'forecast');
之后使用把这个作为维度进行关联
然后作为一个维度进行查询,不知道您是这个意思么?
但是这个变态的设计就是要求尽量不改表的设计,要是按照您这样做的话,那么表StdShipCost的scenario字段的类型就要改变了。请教~
我大概明白您的意思,就是更改表的结构式么。将scenario改成int字段关联维度表(dim Scenario)。然后建立维度表比如说
CREATE TABLE DimScenario(
ScenarioKey int IDENTITY(1,1) NOT NULL,
ScenarioName nvarchar](50) NULL,
)
之后插入数据
insert into DimScenario values (1,'fact');
insert into DimScenario values (1,'budget');
insert into DimScenario values (1,'forecast');
之后使用把这个作为维度进行关联
然后作为一个维度进行查询,不知道您是这个意思么?
但是这个变态的设计就是要求尽量不改表的设计,要是按照您这样做的话,那么表StdShipCost的scenario字段的类型就要改变了。请教~
作者: tsinghua_job 发布时间: 2011-03-18
哪里需要改表结构啊,为什么一定要INT型呢, 维表主键难道不能用字符型,
作者: piliskys 发布时间: 2011-03-18