【问题标题】:Sql Sum of child Items子项的 Sql 总和
【发布时间】:2015-10-01 19:19:57
【问题描述】:

我需要将子项的总和添加到父项。子项“childId”与父项“parentId”相同。

在下表中,ParentId '45627' 的总计数为 0。但是,我需要 11。11 是子项总计数的总和。

+----------+---------+-------+------------+  
| ParentId | ChildId | Name  | TotalCount |  
+----------+---------+-------+------------+  
|    45627 |   12568 | Test1 |          0 |  
|    52678 |   45627 | Test2 |          0 |  
|    23123 |   45627 | Test3 |          7 |  
|    54312 |   45627 | Test4 |          3 |  
|    32123 |   45627 | Test5 |          0 |  
|    12111 |   45627 | Test6 |          1 |  
|    32122 |   45627 | Test7 |          0 |  
|    43123 |   45627 | Test8 |          0 |  
+----------+---------+-------+------------+  

预期输出:

+----------+---------+-------+------------+  
| ParentId | ChildId | Name  | TotalCount |  
+----------+---------+-------+------------+  
|    45627 |   12568 | Test1 |         11 |  
|    52678 |   45627 | Test2 |          0 |  
|    23123 |   45627 | Test3 |          7 |  
|    54312 |   45627 | Test4 |          3 |  
|    32123 |   45627 | Test5 |          0 |  
|    12111 |   45627 | Test6 |          1 |  
|    32122 |   45627 | Test7 |          0 |  
|    43123 |   45627 | Test8 |          0 |  
+----------+---------+-------+------------+ 

虽然可以通过self join实现,但是性能太慢了。

有没有其他方法可以更好地获得预期的输出。

我尝试过的查询

SELECT a.parentId
    ,a.childId
    ,out1.TotalCount
FROM test a
LEFT JOIN (
    SELECT a.parentId
        ,sum(b.TotalCount) AS TotalCount
    FROM test a
    INNER JOIN test b ON a.ParentId = b.childId
    GROUP BY a.ParentId
    ) AS out1 ON a.ParentId = out1.ParentId

注意:以上表格为示例。记录数可以是 10,000。

【问题讨论】:

  • 显示你尝试了什么。这样我们就可以为您提供其他选项,而不是重复您已经尝试过的选项。
  • 只希望它用于 SQL-SERVER 还是任何 RDBMS 都可以?
  • 我认为您的 ChildID 和 ParentID 列颠倒了? 45627 看起来像所有这些孩子的父母。但我们可以等待 dna 结果。
  • 在写着“ParentId”的地方应该读作“Id”。上面写着“ChildId”的地方应该是“ParentId”。显示。我们。什么。你。有。试过了。
  • 每行缩进4个空格,或者只选择文本并按ctrl-K应用格式代码

标签: sql sql-server


【解决方案1】:

列名没有意义,输入数据没有意义,(但这值得商榷),所需的输出也没有任何意义。这就是为什么这个问题还没有得到任何答案的原因。

假设首先,“ParentId”已重命名为“Id”,“ChildId”已重命名为“ParentId”,这样模型才有意义,并且数据有点意思,那么以下:

CREATE TABLE TEST
(
    Id INTEGER, 
    ParentId INTEGER, 
    Name NVARCHAR(100), 
    TotalCount INTEGER 
);

INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 45627, 12568, 'Test1', 0 );
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 52678, 45627, 'Test2', 0 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 23123, 45627, 'Test3', 7 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 54312, 45627, 'Test4', 3 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 32123, 45627, 'Test5', 0 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 12111, 45627, 'Test6', 1 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 32122, 45627, 'Test7', 0 );  
INSERT INTO TEST( Id, ParentId, Name, TotalCount ) VALUES( 43123, 45627, 'Test8', 0 );  

SELECT Parent.Id, SUM( Child.TotalCount ) AS Total
   FROM TEST AS Parent 
       LEFT JOIN TEST As Child ON Parent.id = Child.ParentId
GROUP BY Parent.Id;

产生以下输出:

Id, Total
12111, NULL
23123, NULL
32122, NULL
32123, NULL
43123, NULL
45627, 11
52678, NULL
54312, NULL

对于给定的输入数据,哪个是正确的输出,并且根据上述假设。

它也恰好为 45627 产生 11,这正是 OP 想要的。

如果问题被编辑为有意义,我会相应地修改我的答案。

【讨论】:

  • 如果您要加入多个子表,这不会给出不正确的总数吗?
  • 好吧,如果样条网状结构有被除数,或者通量电容器出现冷凝,那么它会给出不正确的总数,但是多个子表是从哪里来的?
  • 我正在处理与 OP 类似的问题,只是使用一个包含多个子表的表(薪水)来汇总(收入、税收、扣除额)。
  • @Stevoisiak 您可能想发布一个单独的问题,显示您的表结构和一些示例数据,以便可以在 sqlfiddle 或类似网站上复制您的设置。
【解决方案2】:

如果我正确理解您的需求,此查询应该符合您的期望:

SELECT x.parentId,
       x.childId,
       CASE WHEN x.total > 0 THEN x.total ELSE x.TotalCount END AS Total
FROM    
   (SELECT a.parentId
          ,a.childId,
          ,a.TotalCount
          ,(SELECT SUM(b.TotalCount) FROM test b WHERE b.childId = a.parentId) AS total
    FROM test a ) x

【讨论】:

  • 但这会更新所有记录的总数。我只需要父母。希望我的预期输出与您的查询不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多