Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menolak Nilai Mengurangkan daripada Berbilang Baris Sambil Mengekalkan Nilai Terkumpul?

Bagaimana untuk Menolak Nilai Mengurangkan daripada Berbilang Baris Sambil Mengekalkan Nilai Terkumpul?

Linda Hamilton
Lepaskan: 2025-01-10 11:55:42
asal
770 orang telah melayarinya

How to Subtract a Depleting Value from Multiple Rows While Maintaining Cumulative Values?

Menolak Nilai Susutan daripada Berbilang Lot

Masalah ini melibatkan memperuntukkan sumber yang semakin berkurangan (Kuantiti Digunakan) merentas berbilang lot inventori (Pooled_Lots) sambil menjejaki kuantiti terkumpul, baki permintaan dan sebarang lebihan atau defisit.

Struktur Data:

Kami mempunyai dua meja:

  • Pooled_Lots: Mengandungi butiran setiap lot inventori (Kolam, Lot, Kuantiti).
  • Pool_Consumption: Menentukan jumlah kuantiti yang digunakan untuk setiap pool (PoolId, QuantityConsumed).

Hasil yang Diingini:

Pertanyaan harus menghasilkan set hasil untuk setiap lot dalam Pooled_Lots, termasuk:

  • Pool, Lot, Quantity, QuantityConsumed, RunningQuantity, RemainingDemand, SurplusOrDeficit.

Pendekatan Penyelesaian:

Ungkapan Jadual Biasa (CTE) rekursif menyediakan penyelesaian yang berkesan. Logiknya adalah seperti berikut:

  1. Mulakan CTE dengan lot pertama untuk setiap kumpulan.
  2. Untuk lot seterusnya dalam setiap kolam:
    • Kemas kini RunningQuantity dengan menolak QuantityConsumed jika lot Quantity melebihi baki QuantityConsumed.
    • Kira RemainingDemand sebagai perbezaan antara QuantityConsumed dan jumlah RunningQuantity dan lot semasa Quantity.
    • Untuk lot terakhir dalam setiap kumpulan, kira SurplusOrDeficit sebagai perbezaan antara RunningQuantity dan RemainingDemand.

Pertanyaan SQL (Ilustratif):

Pertanyaan yang diberikan tidak lengkap dan mengandungi beberapa ketidakkonsistenan logik. Penyelesaian yang teguh memerlukan pengendalian yang teliti bagi kes tepi (cth., QuantityConsumed sifar atau melebihi jumlah kuantiti semua lot dalam kumpulan). Pertanyaan yang diperbetulkan dan lebih cekap perlu dibuat berdasarkan sistem pangkalan data tertentu (cth., SQL Server, PostgreSQL, MySQL). Berikut ialah garis konsep pendekatan yang lebih tepat:

<code class="language-sql">WITH RecursiveCTE AS (
    -- Anchor member: Select the first lot for each pool
    SELECT 
        PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, 
        PL.Quantity AS RunningQuantity, 
        CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity ELSE PC.QuantityConsumed - PL.Quantity END AS RemainingDemand, 
        0 AS SurplusOrDeficit,
        ROW_NUMBER() OVER (PARTITION BY PL.Pool ORDER BY PL.Lot) as rn
    FROM Pooled_Lots PL
    LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId
    WHERE PL.Lot = 1 --First lot

    UNION ALL

    -- Recursive member: Process subsequent lots
    SELECT 
        PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed,
        CASE 
            WHEN r.RemainingDemand > PL.Quantity THEN r.RunningQuantity - PL.Quantity
            ELSE r.RunningQuantity - r.RemainingDemand
        END AS RunningQuantity,
        CASE 
            WHEN r.RemainingDemand > PL.Quantity THEN r.RemainingDemand - PL.Quantity
            ELSE 0
        END AS RemainingDemand,
        CASE WHEN r.rn = (SELECT MAX(rn) FROM RecursiveCTE WHERE Pool = PL.Pool) THEN r.RunningQuantity - r.RemainingDemand ELSE 0 END AS SurplusOrDeficit,
        r.rn + 1
    FROM Pooled_Lots PL
    INNER JOIN RecursiveCTE r ON PL.Pool = r.Pool AND PL.Lot = r.rn + 1
    LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId
)
SELECT * FROM RecursiveCTE
ORDER BY Pool, Lot;</code>
Salin selepas log masuk

Keputusan:

Output akan menunjukkan butiran setiap lot, termasuk kumulatif RunningQuantity, baki RemainingDemand dan mana-mana SurplusOrDeficit selepas peruntukan. Ketepatan pengiraan RunningQuantity, RemainingDemand dan SurplusOrDeficit bergantung pada logik tepat yang dilaksanakan dalam CTE rekursif untuk mengendalikan semua senario yang mungkin. Penyelesaian yang lengkap dan teruji memerlukan mengetahui sistem pangkalan data khusus dan data yang berpotensi menjadi sampel untuk pengesahan.

Atas ialah kandungan terperinci Bagaimana untuk Menolak Nilai Mengurangkan daripada Berbilang Baris Sambil Mengekalkan Nilai Terkumpul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan