db2 如何使用SQL计算运行余额

js5cn81o  于 2022-11-29  发布在  DB2
关注(0)|答案(2)|浏览(193)

如果我的总数量= 100,并且它已在4个阶段中发运,行40、10、25、25等于100。当我运行此查询时:
有人帮我完成了这个查询。我希望DB2也有同样的runnable。

SET totalQty = -1;
SELECT 
  IF(@totalQty<0, pl.quantity, @totalQty) AS totalQty, 
  pr.invoiceqty, 
  @totalQty:=(@totalQty - pr.invoiceqty) AS balance 
FROM 
  purchaseorderline pl, replenishmentrequisition pr

我得到这样的结果:

--total qty--   --invoice qty-- --balance qty--
100 40  60
100 10  90
100 25  75
100 25  70

我想要的结果是:

--total qty--   --invoice qty-- --balance qty--
100 40  60
60  10  50
50  25  25
25  25  00
polhcujo

polhcujo1#

如果你能以表格的形式提供一些样本数据,而不仅仅是你在表格上得到的数据,那就足够了。

WITH MYTAB (PHASE_ID, QTY) AS
(
-- Your initial data as the result of
-- your base SELECT statement
VALUES
  (1, 40)
, (2, 10)
, (3, 25)
, (4, 25)
)
SELECT 
  QTY + QTY_TOT - QTY_RTOT  AS "total qty"
, QTY                       AS "invoice qty"
, QTY_TOT - QTY_RTOT        AS "balance qty"
FROM 
(
  SELECT 
    PHASE_ID
  , QTY
  -- Running total sum
  , SUM (QTY) OVER (ORDER BY PHASE_ID)  AS QTY_RTOT
  -- Total sum
  , SUM (QTY) OVER ()                   AS QTY_TOT
  FROM MYTAB
)
ORDER BY PHASE_ID

| 总数量|发票数量|余额数量|
| - -|- -|- -|
| 100个|四十|六十|
| 六十|10个|五十个|
| 五十个|二十五个|二十五个|
| 二十五个|二十五个|第0页|

rhfm7lfc

rhfm7lfc2#

Marks的一个变体答案是:

WITH MYTAB (PHASE_ID, QTY) AS
(
    -- Your initial data as the result of
    -- your base SELECT statement
    VALUES (1, 40)
         , (2, 10)
         , (3, 25)
         , (4, 25)
)
SELECT QTY_TOT  AS "total qty"
     , QTY      AS "invoice qty"
     , coalesce(lead(QTY_TOT) over (order by phase_id),0) AS "balance qty"
FROM 
( SELECT PHASE_ID
       , QTY
       -- Running total sum
       , SUM (QTY) OVER (ORDER BY PHASE_ID desc)  AS qty_tot
  FROM MYTAB
)
ORDER BY PHASE_ID

它在外部级别使用提前量,而不是在内部级别对整个窗口求和
Fiddle

相关问题