SQL: Mengendalikan penurunan nilai dalam baris
Dalam SQL, apabila bekerja dengan berbilang baris data, penolakan nilai secara berperingkat daripada set baris boleh menjadi mencabar, terutamanya jika nilai yang dikurangkan menghabiskan nilai sumber. Begini cara untuk menyelesaikan masalah jenis ini:
Andaikan anda mempunyai dua jadual:
Anda memerlukan set hasil, menolak nilai QuantityConsumed dari jadual Pooled_Lots, dengan mengambil kira peraturan berikut:
Untuk mencapai ini, ungkapan jadual biasa rekursif (CTE) boleh digunakan:
<code class="language-sql">WITH Amos AS ( -- 从每个Pool的Lot 1开始。 SELECT PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity WHEN PL.Quantity >= PC.QuantityConsumed THEN PL.Quantity - PC.QuantityConsumed WHEN PL.Quantity = PC.QuantityConsumed THEN 0 WHEN PL.Quantity < PC.QuantityConsumed THEN 0 --处理消耗量大于库存量的情况 ELSE PL.Quantity END AS RunningQuantity, CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity ELSE PC.QuantityConsumed END AS RemainingDemand, CASE WHEN PL.Quantity >= PC.QuantityConsumed THEN 0 ELSE PC.QuantityConsumed - PL.Quantity END AS SurplusOrDeficit FROM Pooled_Lots PL LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId AND PL.Lot = 1 -- 关联到Lot 1 UNION ALL SELECT a.Pool, a.Lot + 1, PL.Quantity, PC.QuantityConsumed, CASE WHEN a.RunningQuantity >= PC.QuantityConsumed THEN a.RunningQuantity - PC.QuantityConsumed WHEN a.RunningQuantity < PC.QuantityConsumed THEN 0 ELSE a.RunningQuantity END AS RunningQuantity, CASE WHEN PC.QuantityConsumed IS NULL THEN 0 ELSE PC.QuantityConsumed END AS RemainingDemand, CASE WHEN a.RunningQuantity >= PC.QuantityConsumed THEN 0 ELSE PC.QuantityConsumed - a.RunningQuantity END AS SurplusOrDeficit FROM Amos a INNER JOIN Pooled_Lots PL ON a.Pool = PL.Pool AND a.Lot + 1 = PL.Lot LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId AND PL.Lot = a.Lot + 1 ) SELECT * FROM Amos;</code>
CTE ini secara berulang menolak nilai QuantityConsumed daripada baris Pooled_Lots sehingga ia mencapai baris terakhir. Ia mengira RunningQuantity, RemainingDemand dan SurplusOrDeficit mengikut peraturan yang ditetapkan.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Nilai Mengurangkan dalam Baris SQL Menggunakan CTE Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!