我们有一个员工维度,其中包含管理者的自我引用(父子关系),我们在其上构建了层次结构。
DimStaff表:
| SurrogateKey | BusinessKey | Employee Name | ManagerBusinessKey | StartDate | EndDate |
| 1 | 1 | Manager1 | NULL | 2013-01-01 | 2099-01-01|
| 2 | 2 | Manager2 | NULL | 2013-01-01 | 2099-01-01|
| 3 | 3 | Employee1 | 1 | 2013-01-01 | 2014-01-01|
| 4 | 3 | Employee1 | 2 | 2014-01-02 | 2099-01-01|
事实表:
| StaffKey | DateKey | Measure1 |
| 3 | 20130405 | 10 |
| 4 | 20140203 | 20 |
现在,以此数据集为例,要求是
1-能够深入了解层次结构
Manager1
-> Employee1
-> Measure1=10
Manager2
-> Employee1
-> Measure1=20
2-选择一个人时,聚合每个层次结构级别的值
Employee1 -> Measure1=30
我们怎么能这样做呢? (问题是我们构建它但第二个要求不起作用,因为多维数据集接受Employee1的两个状态作为两个单独的enities并且不会聚合它们。)
答案 0 :(得分:0)
我听起来像是在使用SurrogateKey作为KeyColumns属性的属性上定义了Employee Name。我将定义一个新属性,其中包含KeyColumns的BusinessKey和NameColumn的Employee Name。
答案 1 :(得分:0)
尝试使用以下SQL获取答案
DECLARE @DimStaff table(
SurrogateKey INT,
BusinessKey INT,
EmployeeName Varchar(30),
ManagerBusinessKey INT,
StartDate DATE,
EndDate DATE
);
Insert into @DimStaff
(SurrogateKey, BusinessKey, EmployeeName, ManagerBusinessKey, StartDate, EndDate)
Values
(1,1,'Manager1', NULL, '2013-01-01', '2099-01-01'),
(2,2,'Manager2', NULL, '2013-01-01', '2099-01-01'),
(3,3,'Employee1', 1, '2013-01-01', '2014-01-01'),
(4,3,'Employee1', 2, '2014-01-02', '2099-01-01')
DECLARE @FactTable table(
StaffKey INT,
DateKey DATE,
Measure1 INT
);
INSERT INTO @FactTable
(StaffKey, DateKey, Measure1)
Values
(3, '2013-04-05', 10 ),
(4, '2013-02-03', 20 )
select t1.EmployeeName as Manager, t2.EmployeeName as Employee, ft.Measure1 as Measure from @DimStaff t1
inner join @DimStaff t2 on t1.BusinessKey = t2.ManagerBusinessKey
inner join @FactTable ft on ft.StaffKey = t2.SurrogateKey
select t1.EmployeeName as Employee, sum (ft.Measure1) as TotalMeasure from @DimStaff t1
inner join @FactTable ft on ft.StaffKey = t1.SurrogateKey
group by t1.EmployeeName