Selain komentar dan jawaban yang telah Anda berikan, saya yakin Anda telah membuat prosedur Anda terlalu rumit. Anda melakukan hal-hal yang sangat prosedural, daripada berpikir dalam set sebagaimana mestinya. Anda juga mendapatkan kolom agregat dalam tiga kueri yang pada dasarnya identik (misalnya tabel yang sama, kondisi gabungan, dan predikat) - Anda dapat menggabungkan semuanya untuk mendapatkan tiga hasil dalam satu kueri.
Sepertinya Anda mencoba menyisipkan ke tabel pembelian historis klien jika baris belum ada untuk klien itu, jika tidak, Anda memperbarui baris. Itu segera meneriakkan "pernyataan MERGE" kepada saya.
Menggabungkan semua itu, saya pikir prosedur Anda saat ini seharusnya hanya berisi satu pernyataan gabungan:
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;
Namun, saya memiliki beberapa kekhawatiran tentang logika dan/atau model data Anda saat ini.
Sepertinya Anda mengharapkan paling banyak satu baris per clientid muncul di clienthistorispembelian. Bagaimana jika clientid memiliki dua atau lebih pesanan yang berbeda? Saat ini Anda akan menimpa setiap baris yang ada.
Juga, apakah Anda benar-benar ingin menerapkan logika ini di semua pesanan setiap kali dijalankan?