0

質問があまり明確ではないかもしれませんが、よりよく説明しようとします:

私はデータ ウェアハウスを構築しており、ROLAP 用の Product ディメンション テーブルの構築に取り組んでいます。ディメンションには、製品、ブランド、クライアントが含まれます。

したがって、OLTP には、Client テーブルをキーオフする Brand テーブルをキーオフする Product テーブルがあります。データ入力中に、製品は不明であるがブランドはわかっている場合があるため、ProductID フィールドに NULL が含まれることがあります。

そのため、データ ウェアハウスを使用して、SSIS 経由で ROLAP をロードするために使用される OLTP のビューを作成しています。ブランドとクライアントを含むすべての製品のリストを作成するビューがあります。私がする必要があるのは、製品またはブランドが不明または NULL の場合に対応する結果をそのビューに追加する方法を見つけることです。

クロス結合を使用してみましたが、ブランドの契約が正しくないなどの行を取得していました。

  • 製品 (ID、製品名、ブランド ID)
  • ブランド (ID、ブランド名、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

私のコメントをフォローアップするには、ここに行きます-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 に答える
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 に答える