从维度表设置事实表中的 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_measure
和Abandoned_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的主要内容,如果未能解决你的问题,请参考以下文章