2017-12-21 5 views
0

Mein Titel ist ein bisschen zweideutig, aber ich werde versuchen, unten zu klären.Links beitreten mit Logik/Zustand

Ich habe eine Ansicht (A) mit ein paar Joins erstellt. Ich versuche, diese Ansicht mit einer anderen Ansicht zu verbinden (B). Beide Ansichten enthalten ein Jahr-Feld, Firmen-ID, Industrie-ID und einen Produkt-Code, der den Wert I oder U annimmt.

Ansicht B enthält auch die Mitarbeiter-ID, normalerweise gibt es mehrere Mitarbeiter-IDs für jedes Unternehmen ICH WÜRDE. Jede Mitarbeiter-ID könnte einen Produktcode haben, der I, U oder beides ist. Wenn es beides hat, gibt es zwei identische Mitarbeiter-IDs, die durch den Produktcode unterschieden werden.

Jetzt möchte ich Ansicht A auf Jahr, Kunden-ID, Industrie-ID und Produktcode beitreten. ABER, da jede Kundennummer in Sicht B zweimal vorkommen kann (wenn die zugrundeliegenden Mitarbeiter für diesen Kunden sowohl Produktcode I als auch U haben), möchte ich nur einmal beitreten.

Dies ist die Verteilung der Kunden-IDs für Produktcodes:

I und NICHT U: 165'370

U und NICHT I: 45'27

U und 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' 

Dies wird die Verbindung I mit zur Zeit renne, obwohl ich alle Datensätze bin auszuschließen, wenn die CustomerID Produktcode U. der Grund, warum ich möchte nur beitreten einmal pro Kundennummer haben/Year/IndustryID liegt daran, dass ich später einen anderen Wert aus Ansicht A aggregiere. Daher kann dieser Wert nicht zweimal angezeigt werden.

Aktuelles Ergebnis

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 

Was würde ich

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

Viel zu viel Text, viel zu wenig Daten. Ich kann das Problem mit Ihren Daten nicht sehen, daher fällt es mir sehr schwer, Ihnen zu helfen. Überlegen Sie, Ihre Frage zu bearbeiten und Beispieldaten einzugeben, die Ihr Problem veranschaulichen. –

+1

Fügen Sie einige Beispieldaten aus beiden Ansichten hinzu, um die gewünschten Ergebnisse zu erhalten. Dies erklärt mehr als das, was Sie erwähnt haben. –

+0

Hallo. Deine Erklärung ist nicht klar. Sagen Sie, welche Zeilen im gewünschten Ergebnis erscheinen, basierend auf den Zeilen, die in den Eingaben erscheinen. Geben Sie eine ausführbare Beispieleingabe, DDL, Ansichten, falls erforderlich, und die gewünschte Ausgabe ein. Auch für Ihre aktuelle Ausgabe. Lesen und handeln Sie auf [mcve].Was meinst du mit "Ich möchte der Ansicht A beitreten"? Mit B? Was bedeutet "Ich möchte nur einmal beitreten"? Und du sagst eindeutig nicht *, dass du A auf B auf Spalten einschließlich Produkt verbindest; du meinst etwas * wie * das - was * meinst du? Sie schreiben nicht wirklich, was Sie meinen oder klar. – philipxy

Antwort

1

mag Wenn ich richtig verstehe, versuchen, etwas wie folgt

[Pseudo-Code]

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

Die i dea soll Nummer 1 entweder zuweisen, wenn es 2 Zeilen für whatMakesItUnique zu ProductCode "I" oder zu "U" gibt, wenn es nur eine Zeile gibt und dann zu dieser zugewiesenen Nummer

"whatMakesItUnique" sind wahrscheinlich Spalten Jahr, CustomerID IndustyID in Ihrem Fall.

+0

Prost! Dies brachte mich in die richtige Richtung! –

0

Ich glaube, Sie können tun, was Sie wollen, mit Außen gelten:

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 

Diese eine Reihe von ViewA zurück, von dem Produktcode priorisiert.