我需要计算具有较小建筑单位的表中的项目总数。例如,假设我有
Unit_Table
UnitId StartUnit EndUnit QtyUnit
---------------------------------------
1 0 2 5
1 0 15 20
1 2 15 15
1 15 30 8
2 0 2 2
2 0 15 12
让我说我有
Final_Table
UnitId StartFinal EndFinal QtyFinal
----------------------------------------
1 0 30
1 0 15
1 2 30
2 0 15
如何使用正确的数字填充QtyFinal列(本例中为28,20,23和12)?我们假设Final_Table所需的所有构建块都在Unit_Table
中以下查询不起作用:
;With Aggr As (
Select F.UnitId
, F.StartFinal
, F.EndFinal
, Sum(U.QtyUnit) As QtySum
From Final_Table As F
Inner Join Unit_Table As U
On F.UnitId = U.UnitId
Where F.StartFinal <= U.StartUnit
And F.EndFinal > U.StartUnit
Group By F.UnitId
, F.StartFinal
, F.EndFinal
)
Update Final_Table
Set QtyFinal = QtySum
From Final_Table As F
Inner Join Aggr
On F.UnitId = Aggr.UnitId
And F.StartFinal = Aggr.StartFinal
And F.EndFinal = Aggr.EndFinal
问题是Unit_Table有重叠(例如,(0-2)(2-15)和(0-15)对于UnitId 1),如何消除0-2和2-15行用于计算0-30的聚合函数?
答案 0 :(得分:0)
我正考虑先处理Final_Table
。然后,对于每一行,我们可以查看&#34;路径&#34;从Unit_Table
开始到结束。
DECLARE
VarStart NUMBER;
VarEnd NUMBER;
VarQty NUMBER;
TotalQty NUMBER;
BEGIN
FOR i IN (SELECT * FROM Final_Table ORDER BY 1, 2) LOOP
VarStart := i.StartFinal;
VarQty := 0;
TotalQty := 0;
LOOP
SELECT EndUnit, QtyUnit
INTO VarEnd, VarQty
FROM Unit_Table
WHERE UnitID = i.Unitid
AND StartUnit = VarStart
AND ROWNUM = 1;
TotalQty := TotalQty + VarQty;
VarStart := VarEnd;
EXIT WHEN VarEnd = i.Endfinal;
END LOOP;
UPDATE Final_Table
SET QtyFinal = TotalQty
WHERE UnitId = i.Unitid
AND StartFinal = i.Startfinal
AND EndFinal = i.EndFinal;
END LOOP;
END;
/
我试过了,结果是:
UNITID STARTFINAL ENDFINAL QTYFINAL
1 0 15 20
1 0 30 28
1 2 30 23
2 0 15 12
当然,当&#34;路径&#34;时,会出现问题。它未在Unit_Table
中完成,如下所示:
UnitId StartUnit EndUnit QtyUnit
---------------------------------------
3 0 2 7
3 15 30 11
...但我不知道你的申请是否可行。也许这不会发生,因为在插入Unit_Table
之前,这是您的要求之一。