用于计算具有重叠/重复数据的表的总计的SQL查询

时间:2016-12-02 20:07:43

标签: sql sql-server

我需要计算具有较小建筑单位的表中的项目总数。例如,假设我有

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的聚合函数?

1 个答案:

答案 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之前,这是您的要求之一。