Filtern von Firmen mit mehr als 2 Ansprechpartnern

Wir würden uns gerne alle Firmen filtern lassen, die mehr als 2 oder n viele Ansprechpartner haben.

Leider haben wir bisher nur den Code gefunden, um uns Firmen ohne oder mit Ansprechpartner anzuzeigen:

SELECT „Companies“.„ID“

FROM „Companies“

WHERE NOT EXISTS(SELECT „CompanyID“ FROM „Contacts“ WHERE „Contacts“.„CompanyID“ =

„Companies“.„ID“)

Wie könnte man das in combit realisieren? Vielleicht bin ich hier auch auf dem Holzweg!

Vielen Dank im Voraus und MfG
Kevin Krieter

Hi Kevin,

mit ein bisschen SQL Magie geht das so:

SELECT "Companies"."ID" 
FROM "Companies" 
WHERE EXISTS
(
	SELECT C2."ID"
	FROM "Companies" C2 INNER JOIN  
	(
	  SELECT C1."ID", 
			(SELECT Count(*) FROM "Contacts" WHERE "Contacts"."CompanyID" = C1.ID) AS "AnsprechpartnerAnzahl"
	  FROM "Companies" C1
	 ) AS FirmenStatistik
	ON C2.ID = FirmenStatistik."ID"
	WHERE "Companies"."ID" = C2."ID" and "AnsprechpartnerAnzahl" > 2
)

Ganz am Ende des Ausdrucks kannst du die Bedingung für die erforderliche Mindestanzahl Ansprechpartner (hier: „AnsprechpartnerAnzahl“ > 2) angeben, den Rest „muss man nicht verstehen“ - einfach per Copy/Paste in den cRM rübernehmen. :slight_smile:

Hope this helps (und ohne Gewähr! ;-P)

Gruß

Alex

PS: wenn es noch eine elegantere Lösung gibt: bitte posten!!

Hallo Herr Krieter,

vermutlich könnte die SQL-Abfrage wie folgt lauten:

select Distinct(Companies.ID)
from Companies, Contacts
where 2 < (Select Count(Contacts.ID) from Contacts where Contacts.CompanyID = Companies.ID)

Beste Grüße
cosmolink Support Team

Vielen Dank an Alex und Herrn Wietzel!
Beide Lösungen führen zum gewünschten Ergebnis.

…allerdings ist die von Herrn Wietzel deutlich eleganter, weil viel weniger komplex! Super!! :slight_smile:

Gruß

Alex

Also erstmal verursacht die Zeile from Companies, Contacts einen CROSS JOIN der hier so wohl nicht gewollt ist. Abgesehen davon könnte man es als „schutzigen“ Code bezeichnen, einen JOIN nicht explizit auch so zu bennen. Bei Subselects wie sie hier in der Klammer aufgeführt werden, muss man sich aus Performancegründen auch Gedanken machen.

Da in Combit ein Filter nur die passenden IDs liefern muss (die nicht zwingend aus der Tabelle stammen müssen auf denen der Filter liegt) würde ich es so machen:
SELECT CompanyID
FROM Contacts
GROUP BY CompanyID
HAVING count(*) > 2

Hier die korrekte, performante und flexible Lösung für die Anfrage:

SELECT
CompanyID
FROM
Contacts
GROUP BY
CompanyID
HAVING COUNT(CompanyID) > «AskString$(„Anzahl Ansprechpartner größer als:“,„2“)»

Es wurde eine Abfrage integriert, mit der die Anzahl der Ansprechpartner zur Ausführung eingetragen werden kann.
Ein Count(*) zählt immer alle Datensätze, während mit Count(CompanyID) nur die Datensätze gezählt werden, in denen die CompanyID nicht NULL ist (Kontakte ohne Firmenbezug).

Ein Komma entspricht einem Join, der in Abhängigkeit der Where Clause z.B. ein Inner Join oder Cross Join sein kann. Ausgeschrieben lässt sich das auch besser lesen - insbesondere bei größeren Abfragen.