Ngoài những nhận xét và câu trả lời bạn đã được đưa ra, tôi tin rằng bạn đã quá phức tạp hóa quy trình của mình. Bạn đang làm mọi thứ một cách rất thủ tục, thay vì suy nghĩ theo bộ như bạn nên làm. Bạn cũng đang nhận được các cột được tổng hợp trong ba truy vấn về cơ bản giống hệt nhau (ví dụ:cùng một bảng, điều kiện kết hợp và vị từ) - bạn có thể kết hợp tất cả chúng để nhận được ba kết quả trong một truy vấn duy nhất.
Có vẻ như bạn đang cố chèn vào bảng clienthistoricalpurchases nếu một hàng chưa tồn tại cho ứng dụng đó, nếu không, bạn cập nhật hàng. Điều đó ngay lập tức hét lên "tuyên bố MERGE" với tôi.
Kết hợp tất cả những điều đó, tôi nghĩ thủ tục hiện tại của bạn chỉ nên chứa một câu lệnh hợp nhất duy nhất:
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;
Tuy nhiên, tôi có một số lo ngại về mô hình logic và / hoặc dữ liệu hiện tại của bạn.
Có vẻ như bạn đang mong đợi nhiều nhất một hàng cho mỗi khách hàng sẽ xuất hiện trong các giao dịch mua khách hàng. Điều gì sẽ xảy ra nếu một khách hàng có hai hoặc nhiều đơn đặt hàng khác nhau? Hiện tại, bạn sẽ ghi đè bất kỳ hàng hiện có nào.
Ngoài ra, bạn có thực sự muốn áp dụng logic này cho tất cả các đơn đặt hàng mỗi khi nó được chạy không?