【问题标题】:How to do a rollup of one table in SQL Server and have child tables rolled up to refer correctly to the rolled up parent rows in SQL Server如何在 SQL Server 中汇总一个表并汇总子表以正确引用 SQL Server 中汇总的父行
【发布时间】: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


【解决方案1】:

第一个表:

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]

【讨论】:

  • 有趣的理论,但类型不能保证从特定值开始或包含序列中的所有值(它们可能是 2、5、7)或类似的东西。
  • 类型和父表的类型不一样?
  • 父表有Type。子表有组。它们不相关。
  • 你可以编辑所需的数据和输出以便我可以清除它
  • 更改父表和子表的数据,只要你觉得会例外,就需要相应的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多