从维度表设置事实表中的 ID

Posted

技术标签:

【中文标题】从维度表设置事实表中的 ID【英文标题】:Setting the ID in a fact table from a dimension table 【发布时间】:2013-03-29 11:18:29 【问题描述】:

在我的废弃呼叫维度表中,我有 ID 1 代码 NO ,ID 2 代码 YES 我想根据调用是否使用连接被放弃,将这些 ID 加载到事实表中。

我遇到的问题是,我的数据库中的 Abandoned 值对于 NO 为 NULL,对于 YES 为 1。

所以当我加入时

 INNER JOIN datamartend.dbo.Abandoned_Call_Dim 
         ON incoming_measure.Abandoned = Abandoned_Call_Dim.abandoned_code

没有结果?

对此有什么想法吗?

基本上需要的是:

如果度量中的废弃值为 null,我希望废弃维度中的废弃 ID 为 2,如果不为 null,则废弃 id 为 2

谢谢

【问题讨论】:

您是说incoming_measureAbandoned_Call_Dim 表中都有NULL 吗?您能否显示更多查询,因为查询的其他部分可能是造成这种行为的原因 不,如果调用没有被放弃,maincall 表中只有一个空值。在废弃的暗淡中,未废弃的 id 为 3 在主表中,如果它被废弃,则为 1,在维度中为 2。我不知道如何将 maincall 中的值与维度 id 匹配? 你不能只用ISNULL(MAINCALLTABLE.Abandoned,3)替换你的连接部分吗? 嗯我试过了,但我似乎没有工作,这是个好主意。 您能否将整个查询添加到帖子中 - 我怀疑查询的另一部分是罪魁祸首。在 SELECT 的分组部分中可能是 NULL 【参考方案1】:

您可以使用 CASE WHEN 子句来解决这个问题(或 ISNULL,但 case when 更易于跨不同的数据库引擎)

 INNER JOIN datamartend.dbo.Abandoned_Call_Dim 
         ON case when incoming_measure.Abandoned is null then '0' 
                 else  incoming_measure.Abandoned end 
          = case when Abandoned_Call_Dim.abandoned_code is null then '0' 
                 else Abandoned_Call_Dim.abandoned_code end 

这会将空值替换为 0。只要你没有 0 代码,你应该没问题。如果这样做,请尝试 -1,或其他一些您知道不在可能的代码集中的值。

如果你有一组未知的代码要做的另一件事是加入并添加:

 OR (incoming_measure.Abandoned is null and Abandoned_Call_Dim.abandoned_code is null)

从技术上讲,它不加入 - 它交叉加入空记录(只要只有一个空值对废弃的呼叫暗淡很重要,就可以了)。

【讨论】:

谢谢,我运行了顶部代码,它说“将 varchar 值 'Unknown' 转换为数据类型 int 时转换失败”我不明白,因为两者都是 varchar? 查看我的编辑。我在 0 周围添加了引号,因为您存储为 varchar。根据需要进行修改,例如,维度将 NO 存储为 0,但事实表列只是一个空值。【参考方案2】:

在Join之前,你能否检查一下你是否可以对ID使用解码功能。

解码(值)= 加入列

或尝试使用 COALESCE(REPLACE(COL, VAL_TO_B_REPLACE_IF_NOT_NULL), VALUE_TO_REPLCE_WHEN_NULL)

【讨论】:

以上是关于从维度表设置事实表中的 ID的主要内容,如果未能解决你的问题,请参考以下文章

基于链接到维度表之一的事实表中的键添加新维度

为啥事实表中的维度成员集通常用作复合键?

星型模式 - 事实表中的属性

在另一个事实表中使用退化维度

SSAS:我的维度表可以包含事实表中没有的键吗?

BIEE04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0