2017-05-30 1 views
0

Dinge einfach zu halten, gehe ich davon habe eine Tabelle Kunden und die Produkte, die sie halten, wie so enthalten:Finding Zeilen, in denen mehrere Kriterien mit vielen zu vielen Beziehungen erfüllt sind

Client_ID  Product_Held 
    1   Product1 
    1   Product2 
    1   Product3 
    2   Product1 
    2   Product2 
    3   Product1 
    3   Product1 

Ein Kunde halten können eine beliebige Kombination von Produkten und Vielfache des gleichen Produkts.

Ich möchte in der Lage sein, meine Abfrage auf alle Clients zu beschränken, die nur Product1 und Product2 enthalten, und ich habe ein wenig Schwierigkeiten, herauszufinden, die Logik benötigt. Wenn ich mit Product1 und Product2 nach allen Kunden suche, werden meine Ergebnisse diejenigen einschließen, die nur Product1 besitzen, sowie diejenigen, die nur Product2 besitzen.

In der Vergangenheit habe ich nur meine Ergebnisse in Excel gedumpt, eine Spalte, die die beiden Felder kombiniert, dh 1Product1, 1Product2, und schreiben eine schnelle Formel, die im Grunde sagt, wenn 1Product1 existiert und 1Product2 existiert, dann als markieren OK, und alles andere ausfiltern, aber vermutlich sollte es eher trivial sein, um durch meine Abfrage stattdessen zu erreichen.

Ich fühle mich wie ich so etwas haben soll:

WHERE Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product1' 
AND Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product2' 

aber Probleme mit der Syntax, auch nicht sicher, ob dies eine gültige Methode?

Antwort

0

Sie können dies mit Aggregation und having:

select client_id 
from t 
group by client_id 
having sum(case when product_held = 'Product1' then 1 else 0 end) > 0 and 
     sum(case when product_held = 'Product2' then 1 else 0 end) > 0 and 
     sum(case when product_held in ('Product1', 'Product2') then 1 else 0 end) = count(*); 

Was ist dies zu tun? Die ersten beiden Bedingungen zählen, wie oft jedes Produkt für jeden Client angezeigt wird. Die > 0 bedeutet, dass es mindestens eine von ihnen gibt.

Die letzte Bedingung prüft, ob die Anzahl der beiden Produkte mit allen Zeilen übereinstimmt. Dies garantiert, dass alle Produkte diese beiden Produkte sind. Sie könnten dies auch so ausdrücken:

 sum(case when product_held not in ('Product1', 'Product2') then 1 else 0 end) = 0; 
+0

Danke, das hat perfekt funktioniert. Obwohl ich durch meine Aussage einige Probleme mit meiner Gruppe hatte. Der Einfachheit halber habe ich es als eine Tabelle ausgedrückt, aber es sind tatsächlich mehrere Tabellen mit Joins, und die Anweisung würde nur funktionieren, wenn ich jedes einzelne Feld in meine select-Anweisung, in meine Gruppe by-Anweisung eingeschlossen hätte, dh: SELECT Field 1, Feld2, Feld3, GROUP BY Feld1, Feld2, Feld3. Ich lerne immer noch die Seile mit SQL, müssen GROUP BY-Anweisungen immer alle Felder innerhalb Ihrer SELECT-Anweisung enthalten? – Dekks

+0

Am Ende habe ich das als Unterabfrage ausgeführt und dann meine Hauptabfrage sagen wo client_id in (Abfrage mit Gruppenklausel). Nicht sicher, ob es der effizienteste Weg ist, aber das ist eine Frage für einen anderen Tag! – Dekks

Verwandte Themen