SQL - 与子/主组进行求和

时间:2015-03-23 18:13:07

标签: sql-server sql-server-2012 sum aggregate-functions

我们假设我有table如下:

     LogicalRef               Code          Balance    
              1             320.01             11.5
              2             320.01                9
              3          320.01.03               10
              4             320.02                7
              5             320.03                0
              6          320.03.01                3
              7          320.03.01                4

我想获得每个代码的不同代码和总和,以便将子组的总和添加到主组中。因此,SELECT Code, SUM(Balance) FROM table GROUP BY Code不起作用。

我想得到下表:

                Code          SUM
              320.01         30.5
           320.01.03           10
              320.02            7
              320.03            7
           320.03.01            7

我想必须有LIKE Code + '%'的内容,但到目前为止我找不到任何解决方案。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

SELECT LEFT(code, 6) AS Code, SUM(balance) AS SUM
FROM mytable
GROUP BY LEFT(code, 6)

获取code前两部分的所有组的总和:

Code    SUM
-------------
320.01  30.5
320.02  7
320.03  7

然后简单地UNION包含包含整个代码的组的总和:

SELECT code AS Code, SUM(balance) AS SUM
FROM mytable
WHERE LEN(code) > 6
GROUP BY code

以上查询的输出:

Code        SUM
---------------
320.01.03   10
320.03.01   7

将所有内容整合在一起:

SELECT LEFT(code, 6) AS Code, SUM(balance) AS SUM
FROM mytable
GROUP BY LEFT(code, 6)

UNION ALL

SELECT code AS Code, SUM(balance) AS SUM
FROM mytable
WHERE LEN(code) > 6
GROUP BY code

<强>输出:

Code        SUM
------------------
320.01      30.5
320.02      7
320.03      7
320.01.03   10
320.03.01   7

答案 1 :(得分:0)

我们的想法是生成树(代码,父代),按代码连接到主表并按父级分组。此代码不仅限于测试数据,还可以应用于更复杂的树:

declare @t table(code nvarchar(max), balance money)

insert into @t values
('320.01', 11.5), 
('320.01', 9), 
('320.01.03', 10), 
('320.02', 7),
('320.03', 0),
('320.03.01', 3),
('320.03.01', 4)

;with codes as (select distinct code from @t)
,tree as (select code as parent, code from codes
               union all
              select t.parent, c.code from codes c join tree t on c.code like t.code + '.%')
              select t.parent, sum(c.balance) as balance
              from tree t
              join @t c on t.code = c.code
              group by t.parent

工作小提琴http://sqlfiddle.com/#!6/d32ad/37