あなたがすでに与えられたコメントと答えに加えて、私はあなたがあなたの手順を非常に複雑にしすぎたと信じています。あるべき姿でセットで考えるのではなく、非常に手続き的に物事を行っています。また、基本的に同一の3つのクエリ(同じテーブル、結合条件、述語など)で集計列を取得しています。これらすべてを組み合わせて、1つのクエリで3つの結果を取得できます。
そのクライアントの行がまだ存在しない場合は、clienthistoricalpurchasesテーブルに挿入しようとしているようです。それ以外の場合は、行を更新します。それはすぐに私に「MERGEステートメント」を叫びます。
これらすべてを組み合わせると、現在の手順には1つのマージステートメントのみを含める必要があると思います。
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;
ただし、現在のロジックやデータモデルについて懸念があります。
clientidごとに最大で1行がclienthistoricalpurchasesに表示されることを期待しているようです。クライアントIDに2つ以上の異なる注文がある場合はどうなりますか?現在、既存の行を上書きします。
また、実行されるたびにすべての注文にこのロジックを適用したいですか?