Sql server T-SQL:同一查询中的两级聚合

Sql server T-SQL:同一查询中的两级聚合,sql-server,tsql,Sql Server,Tsql,我有一个连接主表和明细表的查询。主表记录按预期在结果中重复。我在细节表上得到了聚合,它工作得很好。但我同时还需要在主表上进行另一个聚合。但由于主表是重复的,聚合结果也会重复 我想用下面的例子来说明这种情况 If Object_Id('tempdb..#data') Is Not Null Drop Table #data Create Table #data (Id int, GroupId int, Value int) If Object_Id('tempdb..#

我有一个连接主表和明细表的查询。主表记录按预期在结果中重复。我在细节表上得到了聚合,它工作得很好。但我同时还需要在主表上进行另一个聚合。但由于主表是重复的,聚合结果也会重复

我想用下面的例子来说明这种情况

    If Object_Id('tempdb..#data') Is Not Null Drop Table #data
    Create Table #data (Id int, GroupId int, Value int)

    If Object_Id('tempdb..#groups') Is Not Null Drop Table #groups
    Create Table #groups (Id int, Value int)

    /* insert groups */
    Insert #groups (Id, Value)
    Values  (1,100), (2,200), (3, 200)


    /* insert data */
    Insert #data (Id, GroupId, Value)
    Values  (1,1,10),
            (2,1,20),
            (3,2,50),
            (4,2,60),
            (5,2,70),
            (6,3,90)
我的选择查询是

Select  Sum(data.Value) As Data_Value,
        Sum(groups.Value) As Group_Value
From    #data data
        Inner Join #groups groups On groups.Id = data.GroupId
结果是

Data_Value  Group_Value
300         1000
Data_Value  Group_Value
300         500
预期结果为:

Data_Value  Group_Value
300         1000
Data_Value  Group_Value
300         500

请注意,派生表或子查询不是选项。另外,
Sum(Distinct groups.Value)
不适合我的情况。

如果我没有错,您只需要对两个表的Value列求和,并将其显示在一行中。在这种情况下,您不需要将它们合并,只需将总和选择为一列,如下所示:

SELECT 
        (
          Select  Sum(d.Value) From    #data d
          WHERE EXISTS (SELECT 1 FROM #groups WHERE Id = d.GroupId )
         ) AS Data_Value
       ,(
          SELECT Sum( g.Value)  FROM #groups g
          WHERE EXISTS (SELECT 1 FROM #data WHERE GroupId = g.Id)
         ) AS Group_Value
SELECT  (SELECT SUM(VALUE) AS Data_Value FROM #DATA), 
        (SELECT SUM(VALUE) AS Group_Value FROM #groups)

我不知道你在找什么。但是,似乎您需要一个组中的值和数据表中表示一个组的收集值。 那样的话,我建议这样做

select Sum(t.Data_Value) as Data_Value, Sum(t.Group_Value) as Group_Value
from
(select Sum(data.Value) As Data_Value, groups.Value As Group_Value
from data 
inner join groups on groups.Id = data.GroupId
group by groups.Id, groups.Value) 
as t

编辑应该可以帮到你。

SUM(Distinct)不是选项,因为有组记录具有相同的值。我尝试在示例中简单地演示这种情况。但事实上,我的查询非常复杂,我不能使用子查询。如果没有派生表或子查询,就无法完成查询。为什么这不是一个选项?是否可以将另一个查询包装在当前查询的修改版本中而不使用子查询?@GarethD我的表太大,子查询将花费大量资源。如果这是您的推理,我怀疑您不了解子查询在内部是如何工作的。SQL是一种声明性语言,您告诉它您希望它做什么,而不是如何做。有一个非常好的机会,你可以想出任何黑客做到这一点,将是更昂贵的比仅仅使用一个派生表。你试过子查询吗?您是否确实存在性能问题?如果是这样,您应该考虑尝试添加索引,或者使用可搜索谓词,而不是尝试在没有派生表的情况下重写查询。这是正确的预期结果。这不是你想要的结果。还有很多关于你不能使用的规则。太糟糕了,因为我认为使用派生表可以有效地实现这一点。谢谢,但我不能按
分组。值
字段分组。我需要一个单行结果在这个example@Decoded-这是你要找的编辑吗。如果没有,恐怕我不能帮助你。