Установка идентификатора в таблице фактов из таблицы измерений
В моей таблице измерений для отмененных вызовов у меня есть ID 1, код NO, ID 2, код YES. Я хочу загрузить эти идентификаторы в таблицу фактов, основываясь на том, был ли вызов отменен с помощью объединения.
Однако проблема в том, что значение Abandoned в моей базе данных равно NULL для NO и 1 для YES.
Поэтому, когда я присоединяюсь
INNER JOIN datamartend.dbo.Abandoned_Call_Dim
ON incoming_measure.Abandoned = Abandoned_Call_Dim.abandoned_code
Это тянет без результатов?
Есть идеи по этому поводу?
В основном то, что нужно, это:
Я хочу, чтобы оставленный идентификатор из покинутого измерения был равен 2, если оставленное значение в показателе равно нулю, и оставленный идентификатор 2, если не равен нулю
Спасибо
2 ответа
Можете ли вы проверить, возможно ли вам использовать функцию декодирования для идентификатора, прежде чем присоединиться.
Декодировать (значение) = присоединяющийся столбец
или попробуйте использовать COALESCE(REPLACE(COL, VAL_TO_B_REPLACE_IF_NOT_NULL), VALUE_TO_REPLCE_WHEN_NULL)
Вы можете использовать предложение CASE WHEN, чтобы обойти это (или ISNULL, но случай, когда он более переносим между различными механизмами БД)
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)
Который технически не присоединяется - он перекрестно соединяет нулевые записи (и до тех пор, пока есть только один нулевой, который имеет значение для оставленного вызова dim, у вас все хорошо).