Как мне написать 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".

Другие вопросы по тегам