2017-12-21 20 views
0

私のタイトルは少し曖昧ですが、私は以下で明確にしようとします。論理/条件付き左結合

私はいくつかの結合でビュー(A)を作成しました。私は別のビュー(B)でそのビューに参加しようとしています。両方のビューには、年フィールド、会社ID、業種ID、および、それを呼び出す、IまたはUの値をとる商品コードが含まれています。

ビューBには、すべての会社の従業員ID ID。従業員IDには、I、U、またはその両方の製品コードが含まれている可能性があります。両方がある場合、生産コードによって識別される2つの同一の従業員IDが存在します。

今年は、A、Year、Customer ID、Industry ID、Product CodeのビューAに参加したいと考えています。しかし、ビューBのすべてのカスタマーIDが2回発生する可能性がある(その顧客の従業員が製品コードIとUの両方を持っている場合)、一度だけ参加したい。

これは、製品コードのカスタマーIDの分布である:

IおよびNOT U:165'370

UおよびNOT I:45'27

UおよびI:48'920

left join [raw].[ViewA] a on a.year=b.year and a.CustomerID=b.CustomerID 
and a.IndustryID=b.IndustryID and a.ProductCode ='I' 

これは私が得意で唯一の製品コードは/私は顧客IDごとに一度参加したい理由をUにしたすべてのレコードを除外していますけれども、私は、現在で実行している結合ですYear/IndustryIDは、後でView Aの他の値を集計するためです。したがって、その値を2度表示することはできません。私が正しく理解していれば

現在の結果

Year CustomerID IndustyID ProductCode Value 
2015 A   Z   I   50 
2015 A   Z   U   NULL 
2015 B   Z   I   40 
2016 A   Z   I   20 
2016 B   Z   U   NULL 

私は

[擬似コード]

left join (Select *, rank() over (partition by whatMakesItUnique Order by ProductCode) distinction From tableA) a 
    on your conditions + a.distinction = 1 

I以下のような何かをしようと、

Year CustomerID IndustyID ProductCode Value 
2015 A   Z   I   50 
2015 A   Z   U   NULL 
2015 B   Z   I   40 
2016 A   Z   I   20 
2016 B   Z   U   30 
+4

あまりにも多くのテキスト、あまりにも少ないデータです。私はあなたのデータの問題を見ることができないので、私はあなたを助けることが非常に難しいです。あなたの質問を編集し、あなたの問題を示すサンプルデータを含めることを検討してください。 –

+1

両方のビューからサンプルデータを追加して、この結果を得てください。これは、あなたが言及した以上のものを説明します。 –

+0

こんにちは。あなたの説明ははっきりしていません。入力にどの行が表示されるかに基づいて、目的の結果にどの行が表示されるかを示します。必要に応じて、実行可能な例入力DDLを表示し、必要な出力を表示します。あなたの現在の出力にも。 [mcve]を読んで行動する。「ビューAに参加したい」という意味はどうですか? Bで? 「私は一度だけ参加したい」とはどういう意味ですか?そして、あなたは明らかに、製品を含むコラムのAからBへの参加を意味しません。あなたは何か*そのようなものを意味します - あなたは何を意味しますか?あなたは、あなたが実際に何を意味するのか、はっきりと書くのではない。 – philipxy

答えて

1

が欲しいです1つの行のみが存在し、次にこの割り当てられた番号に参加するときにProductCode "I"にwhatMakesItUniqueの2行があり、 "U"に割り当てられた場合、番号1を割り当てます。

"whatMakesItUnique"はおそらく列Year、CustomerIDあなたの場合はIndustyIDです。

+0

乾杯!これは正しい方向に私を置く! –

0

私はあなたが外側の適用であなたがやりたいことができると思います。

outer apply 
(select top (1) a.* 
from [raw].[ViewA] a 
where a.year = b.year and a.CustomerID = b.CustomerID and 
     a.IndustryID = b.IndustryID 
order by (case a.ProductCode when 'I' then 1 when 'U' then 2 else 3 end) 
) a 

これは、製品コードによって優先順位を付け、ViewAから1行を返します。