Zusätzlich zu den Kommentaren und Antworten, die Sie bereits erhalten haben, glaube ich, dass Sie Ihr Verfahren massiv verkompliziert haben. Sie tun die Dinge sehr prozedural, anstatt in Sätzen zu denken, wie Sie es sein sollten. Sie erhalten auch die aggregierten Spalten in drei Abfragen, die im Wesentlichen identisch sind (z. B. dieselben Tabellen, Join-Bedingungen und Prädikate) – Sie könnten sie alle kombinieren, um die drei Ergebnisse in einer einzigen Abfrage zu erhalten.
Es sieht so aus, als ob Sie versuchen, etwas in die clienthistoricalpurchases-Tabelle einzufügen, wenn für diesen Kunden noch keine Zeile existiert, andernfalls aktualisieren Sie die Zeile. Das schreit mir sofort nach "MERGE-Statement".
Wenn Sie all das kombinieren, denke ich, dass Ihre aktuelle Prozedur nur eine einzige Merge-Anweisung enthalten sollte:
MERGE INTO clienthistoricalpurchases tgt
USING (SELECT clients.client_id,
COUNT(DISTINCT od.productid) distinct_products,
COUNT(od.productid) total_products,
SUM((od.unitprice * od.quantity) - od.discount) proposed_new_balance
FROM orderdetails od
INNER JOIN orders
ON orderdetails.orderid = orders.orderid
INNER JOIN clients
ON orders.clientid = clients.clientid
GROUP BY clients.client_id) src
ON (tgt.clientid = src.client_id)
WHEN NOT MATCHED THEN
INSERT (tgt.clientid,
tgt.distinctproducts,
tgt.totalproducts,
tgt.totalcost)
VALUES (src.clientid,
src.distinct_products,
src.total_products,
src.proposed_new_balance)
WHEN MATCHED THEN
UPDATE SET tgt.distinctproducts = src.distinct_products,
tgt.totalproducts = src.total_products,
tgt.totalcost = src.proposed_new_balance;
Ich habe jedoch einige Bedenken bezüglich Ihrer aktuellen Logik und/oder Ihres Datenmodells.
Es scheint, als würden Sie erwarten, dass höchstens eine Zeile pro Client-ID in clienthistoricalpurchases erscheint. Was ist, wenn eine Client-ID zwei oder mehr verschiedene Bestellungen hat? Derzeit würden Sie jede vorhandene Zeile überschreiben.
Wollen Sie diese Logik wirklich jedes Mal, wenn sie ausgeführt wird, auf alle Bestellungen anwenden?