Sql-Server

減去前幾行的總和

  • May 26, 2021

我想在此表中創建總計欄位。但在 SQL Server 2008 中,不能在 OVER 子句中使用“order by”。

我有相同的 PO 和不同的 INV。我想要 Qty 欄位減去 Quantity 欄位和下一行 Total 欄位減去 Quantity 欄位。這是一個結構表。

在此處輸入圖像描述

這是一個結果。

在此處輸入圖像描述

這是我的程式碼,但在 ORDER BY 處出錯。

select t2.BaseRef 'PO',t2.BaseQty 'qty', t1.NumAtCard 'INV',
       t2.Quantity 'Quantity',
       t2.BaseQty - SUM(t2.Quantity) OVER (ORDER BY t1.DocDate) AS 'total'
from OPDN t1 
       INNER JOIN PDN1 t2 ON t1.DocEntry = t2.DocEntry 

我可以使用其他方式對這些數據進行排序嗎?

如果SUM() OVER()不支持,您可以嘗試以下方法。行按 INV 編號作為文本 (INV100, INV105, …) 排序,而不是按編號 (100, 105, …)。

輸入:

CREATE TABLE #PO (
   PO varchar(10),
   DocEntry int,
   Qty int
)
CREATE TABLE #INV (
   INV varchar(10),
   DocEntry int,
   Qty int
)
INSERT INTO #PO (PO, DocEntry, Qty) VALUES ('A123', 1, 500)
INSERT INTO #PO (PO, DocEntry, Qty) VALUES ('B123', 2, 200)
INSERT INTO #INV (INV, DocEntry, Qty) VALUES ('IV100', 1, 100)
INSERT INTO #INV (INV, DocEntry, Qty) VALUES ('IV102', 2, 10)
INSERT INTO #INV (INV, DocEntry, Qty) VALUES ('IV105', 1, 200)
INSERT INTO #INV (INV, DocEntry, Qty) VALUES ('IV106', 2, 190)
INSERT INTO #INV (INV, DocEntry, Qty) VALUES ('IV112', 1, 200)

陳述:

SELECT 
   p.PO, 
   p.Qty,
   i.INV,
   i.Qty AS Quantity,
   Total = p.Qty - 
           (
            SELECT SUM(rt.Qty) 
            FROM #INV rt 
            WHERE (rt.DocEntry = i.DocEntry) AND (rt.INV <= i.INV)
           )
FROM #PO p
LEFT JOIN #INV i ON (p.DocEntry = i.DocEntry)
ORDER BY p.DocEntry, i.INV

輸出:

PO      Qty INV     Quantity    Total
A123    500 IV100   100         400
A123    500 IV105   200         200
A123    500 IV112   200         0
B123    200 IV102   10          190
B123    200 IV106   190         0
SELECT PO.PO, 
      PO.Qty, 
      INV.INV, 
      INV.Quantity, 
      PO.Qty - SUM(INV.Quantity) OVER (PARTITION BY PO.PO ORDER BY INV.DocDate) total
FROM PO, INV
WHERE PO.DocEntry = INV.DocEntry
ORDER BY PO.PO, INV.DocDate

小提琴

引用自:https://dba.stackexchange.com/questions/231520