如何实现多个以同一个表为目标的nameColumns?

时间:2014-03-06 11:22:46

标签: ssas

我有两张桌子。第一个多次引用第二个。 一些演示数据:

id      fk1     fk2     fk3
-------------------------------
4009    9419    2282    9005
4057    9419    2112    NULL
5480    NULL    4279    NULL
5989    NULL    1677    NULL

第二个表包含表1中外键的名称

id      name
--------------------------------
1677    Bank Account No1
2112    Loyalty Account
2282    Sales Account
4279    Employee Account
9005    Warehouse No1
9419    Sales

我必须为Table1创建一个维度。字段fk1,fk2和fk3应使用nameColumn属性,并显示表2中的值。

我尝试在Data SourcE View中创建此命名查询,但如果我尝试将其放入多维数据集,则部署会在没有正确错误的情况下中断。

SELECT [Table1].[id]
    ,fk1
    ,fk2
    ,fk3 
    ,T2_fk1.name as fk1name
    ,T2_fk2.name as fk1name
    ,T2_fk3.name as fk1name
FROM [dbo].[Table1]
left join Table2 as T2_fk1
    on Table2.id = [Table1].fk1
left join Table2 as T2_fk2
    on Table2.id = [Table1].fk2
left join Table2 as T2_fk3
    on Table2.id = [Table1].fk3

如何实现多个以同一个表为目标的nameColumns?

1 个答案:

答案 0 :(得分:1)

即使在技术上可以在Analysis Services的维度中使用NULL值,这通常也是一个坏主意,因为Analysis Services和关系数据库对它们的处理方式有不同的想法:Analysis Services会对它们进行处理作为空字符串或数字零,而对于关系数据库,通常 - 除了e。 G。旧版本的Oracle,将空字符串视为null - 这些是不同的。因此,当Analysis Services发出包含DISTINCTGROUP BY的SQL语句时,可能会出现多个行,其中Analysis Services只需要一行等等。

最佳做法是避免属性列中的null以及星型模式中的外键列。在度量列中,null很好。因此,您应该将您的陈述更改为

SELECT [Table1].[id]
    ,coalesce(fk1, -1) as fk1
    ,coalesce(fk2, -1) as fk2
    ,coalesce(fk3, -1) as fk3
    ,coalesce(T2_fk1.name, '<unknown>') as fk1name
    ,coalesce(T2_fk2.name, '<unknown>') as fk1name
    ,coalesce(T2_fk3.name, '<unknown>') as fk1name
FROM [dbo].[Table1]
left join Table2 as T2_fk1
    on Table2.id = [Table1].fk1
left join Table2 as T2_fk2
    on Table2.id = [Table1].fk2
left join Table2 as T2_fk3
    on Table2.id = [Table1].fk3

或您选择使用null而不是-1<unknown>替换的任何内容。