0

我知道这个问题可能不太清楚,但我会尝试更好地解释事情:

我正在构建一个数据仓库,并且正在为我的 ROLAP 构建一个产品维度表。该维度将包括产品、品牌、客户。

因此,在 OLTP 中有一个 Product 表,它与 Brand 表相连,而 Brand 表与 Client 表相连。在数据输入过程中,有时产品未知但品牌已知,因此有时 ProductID 字段中有 NULLS。

因此,对于数据仓库,我在 OLTP 上创建视图,这些视图将通过 SSIS 用于加载 ROLAP。我有一个视图,它将创建一个包含其品牌和客户的所有产品的列表。我需要做的是找到一种方法将结果添加到该视图中,以适应产品或品牌为未知或 NULL 的情况。

我尝试使用交叉连接,但我得到的品牌有不正确的合同等。

  • 产品(ID、产品名称、品牌 ID)
  • 品牌(ID、BrandName、ClientID)
  • 客户(ID、客户名称)

我要的最终结果是:

    [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     

您可能会问如果产品是未知的,品牌将如何被知晓?原因是这个系统是为客户来电咨询产品,有时来电者只知道他们打电话的品牌。

所以无论如何,我希望我能很好地解释自己,并且有人可以为我提供解决方案。将不胜感激!

谢谢

4

2 回答 2

0

您需要的是外部连接。就像是:

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;

这样一来,如果所有客户都拥有品牌甚至产品,您就可以让他们独立。

有关 JOIN 的更多信息,请查看我的“ A Join A Day ”系列。

于 2013-01-29T01:21:46.310 回答
0

要跟进我的评论,请执行以下操作 - 您需要使用该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;

还有更多的小提琴

祝你好运。

于 2013-01-29T01:43:09.207 回答