Además de los comentarios y las respuestas que ya le han dado, creo que ha complicado enormemente su procedimiento. Estás haciendo las cosas de manera muy procedimental, en lugar de pensar en conjuntos como debería ser. También obtiene las columnas agregadas en tres consultas que son esencialmente idénticas (por ejemplo, las mismas tablas, condiciones de combinación y predicados); puede combinarlas todas para obtener los tres resultados en una sola consulta.
Parece que está tratando de insertar en la tabla de compras históricas del cliente si aún no existe una fila para ese cliente; de lo contrario, actualice la fila. Eso inmediatamente me grita "declaración MERGE".
Combinando todo eso, creo que su procedimiento actual debería contener solo una sola declaración de combinación:
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;
Sin embargo, tengo algunas preocupaciones sobre su lógica actual y/o modelo de datos.
Parece que espera que aparezca como máximo una fila por ID de cliente en compras históricas de clientes. ¿Qué sucede si un ID de cliente tiene dos o más pedidos diferentes? Actualmente, sobrescribiría cualquier fila existente.
Además, ¿realmente desea aplicar esta lógica en todos los pedidos cada vez que se ejecuta?