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.
Hope this helps (und ohne Gewähr! ;-P)
Gruß
Alex
PS: wenn es noch eine elegantere Lösung gibt: bitte posten!!
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.