Как мне написать SQL-запрос, чтобы вернуть все уровни категоризации продукта с учетом неизвестных?
Я знаю, что вопрос, возможно, не был слишком ясен, но я попытаюсь объяснить вещи лучше:
Я строю хранилище данных и работаю над созданием таблицы измерений Product для моего ROLAP. Измерение будет включать Продукт, Бренд, Клиент.
Таким образом, в OLTP есть таблица Product, которая отключается от таблицы Brand, которая выключает таблицу Client. Во время ввода данных иногда Продукт не известен, но Бренд известен, поэтому в полях ProductID иногда присутствуют значения NULL.
Итак, с хранилищем данных я создаю представления на OLTP, которые будут использоваться через SSIS для загрузки ROLAP. У меня есть представление, которое создаст список всех продуктов с их брендами и клиентами в нем. Что мне нужно сделать, так это найти способ добавить результаты в это представление, которое будет соответствовать, если Продукт или Бренд неизвестен или имеет значение NULL.
Я пытался использовать перекрестные соединения, но я получал ссоры с брендами, имеющими неправильные контракты и тому подобное.
- Продукт (ID, ProductName, BrandID)
- Бренд (ID, BrandName, ClientID)
- Клиент (ID, ClientName)
Конечный результат, к которому я иду:
[ProductID] [ProductName] [BrandID] [BrandName] [ClientID] [ClientName]
1 ProductA 1 BrandA 1 ClientA
2 ProductB 1 BrandA 1 ClientA
3 ProductC 2 BrandB 1 ClientA
....
-2 Unknown 43 BrandABC 33 ClientXYZ
-3 Unknown -2 Unknown 34 ClientABC
-1 Unknown -1 Unknown -1 Unknown
Вы можете спросить, если продукт неизвестен, как бы узнать бренд? Причина в том, что эта система предназначена для звонков клиентов относительно продуктов, и иногда звонящий знает только марку, о которой он звонит.
Так или иначе, я надеюсь, что объяснил себя достаточно хорошо, и что у кого-то есть решение для меня. Это будет высоко ценится!!
Спасибо
2 ответа
Чтобы прокомментировать мой комментарий, вы должны использовать COALESCE
функция:
SELECT P.Id as ProductId, COALESCE(P.ProductName,'Unknown') ProductName,
B.Id as BrandId, COALESCE(B.BrandName,'Unknown') BrandName,
C.Id as ClientId, C.ClientName
FROM Client AS C
LEFT OUTER JOIN Brand AS B
ON C.Id = B.ClientId
LEFT OUTER JOIN Product AS P
ON P.BrandId = B.Id;
И SQL скрипка.
Кстати, если вам нужны отрицательные значения вместо NULL, попробуйте это:
SELECT COALESCE(ProductId, productrn*-1) as ProductId,
ProductName,
COALESCE(BrandId, brandrn*-1) as BrandId,
BrandName,
ClientId,
ClientName
FROM (
SELECT
ROW_NUMBER() OVER(ORDER BY P.Id) productrn,
ROW_NUMBER() OVER(ORDER BY B.Id) brandrn,
P.Id as ProductId, COALESCE(P.ProductName,'Unknown') ProductName,
B.Id as BrandId, COALESCE(B.BrandName,'Unknown') BrandName,
C.Id as ClientId, C.ClientName
FROM Client AS C
LEFT OUTER JOIN Brand AS B
ON C.Id = B.ClientId
LEFT OUTER JOIN Product AS P
ON P.BrandId = B.Id
) t;
И еще скрипка.
Удачи.
Что вам нужно, это внешнее соединение. Что-то вроде:
SELECT *
FROM Client AS C
LEFT OUTER JOIN Brand AS B
ON C.Id = B.ClientID
LEFT OUTER JOIN Product AS P
ON P.BrandId = B.Id;
Таким образом, вы получите независимость всех клиентов, если у них есть бренд или даже продукт.
Для получения дополнительной информации о JOINs, посмотрите мою серию " A Join A Day".