如何在SQL Server中汇总一个表并汇总子表以正确引用SQL Server中汇总的父行

时间:2014-06-25 03:11:26

标签: sql sql-server rollup

我们的数据库中有一些表几乎无限增长,因此我们尝试创建一个定期汇总旧数据的任务(可能是每天),并删除汇总中包含的记录。

使用GROUP BY这相当容易。问题是那些需要卷起来的子表并引用它们引用的新完成的父表行,我不知道如何在不做一些非常蹩脚的子查询的情况下这样做。

作为一个例子,我说我从两个表中的以下数据开始:

父表(ID是IDENTITY列)

ID  Type  Amount
--  ----  ------
 1     1   10.00
 2     1    3.00
 3     3    8.00
 4     3    9.00

儿童表

ParentID  Thing  Qty
--------  -----  ---
       1      8    3
       1      6    6
       2      8    4
       2      5    3
       3      8    2
       3      5    1
       4      5    4

首先,我将父表汇总为按类型分组的新行,然后将金额汇总在一起,这将给出以下内容:

ID  Type  Amount
--  ----  ------
 5     1   13.00
 6     3   17.00

在Parent中创建上述数据的查询查询类似于以下内容:

INSERT INTO Parent (Type, Amount)
SELECT Type, SUM(Amount) AS Amount
FROM Parent
GROUP BY Type

对于子表,我想做类似的事情,除了按“Thing”分组,并使用ParentID对Quantity进行求和,引用与原始Parent对应的新创建的Parent。这将创建如下内容:

ParentID  Thing  Qty
--------  -----  ---
       5      8    7
       5      5    3
       5      6    6
       6      5    5
       6      8    2

此查询看起来类似于以下内容,但我不知道如何获取ParentID或如何链接到Parent表:

INSERT INTO Child (ParentID, Thing, Qty)
SELECT ?, Thing, SUM(Qty) AS Qty
FROM Child
INNER JOIN Parent
    ON ? = ?
GROUP BY ?, Thing

我认为这是经常发生的事情所以有人知道处理这种情况的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

第一张表:

Declare @max int = (Select MAX(ID) from parent)
Select @max

Select @max+R ID,type,Amount
from 
(
Select type,sum(amount) 'Amount',ROW_NUMBER() over(order by type) 'R'
from parent
group by Type
) R

第二张表:

Select @max+TYPE 'ParentID',[group],sum(Qty) 'Qty'
from child
join parent 
on id = parentid
group by type,[group]
order by [parentid],[group]