【发布时间】:2014-08-15 11:30:00
【问题描述】:
我们的数据库中有一些表几乎可以无限增长,因此我们正在尝试创建一个任务,该任务将定期(可能每天)汇总旧数据并删除汇总中包含的记录。
仅使用 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
对于子表,我想做类似的事情,除了按“事物”分组并将 Quantity 与 ParentID 相加,该 ParentID 指的是与原始父级相对应的新创建的父级。这将创建如下内容:
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
我认为这是经常发生的事情,所以有谁知道处理这种情况的正确方法是什么?
【问题讨论】:
-
Parent.Type 和 Child.Group 是否相等?我的意思是它们的名称不同,但它们是否引用相同的内容?
-
你可以检查下面给出的查询并返回
-
Parent.Type 和 Child.Group 不打算以任何方式关联。它们只是我编造的一些随机数据。它们可以是任何值。
-
我更改了示例数据,将 Group 列命名为“Thing”,以避免与 SQL 组混淆,并明确 Type 和 Thing 彼此不相关。
标签: sql sql-server rollup