在单步SQL Server中获取AVERAGE的总和

时间:2016-07-31 20:32:18

标签: sql-server sum subquery average

我的数据集如下所示:

cat subcat  amount
a   x1      1
a   x1      1
a   x1      1
a   x2      4
a   x2      4
a   x3      6
a   x4      3
a   x5      7

我希望SQL查询做的是:

  1. 在每个'subcat'
  2. 中取AVG
  3. SUM置于'猫'级别
  4. 步骤1之后的结果数据集应为:

    cat subcat  amount
    a   x1      1
    a   x2      4
    a   x3      6
    a   x4      3
    a   x5      7
    

    步骤2之后的结果数据集应为:

    cat amount
    a   21
    

    现在我知道使用子查询或创建临时表可以轻松实现这一点。但我希望一步完成(不使用子查询。)

3 个答案:

答案 0 :(得分:1)

你能不做CTE吗?考虑一下您要求的内容:您想知道基于2列的表组的所有行的平均值(这意味着您必须读取表中的所有行) ,然后你想要每个分组的所有新创建的值的总和 - 在开始查询之前,这个数据集甚至不存在。

答案 1 :(得分:0)

以下在技术上是一个子查询,但如果在子级别真正重复数量,则只需要一个聚合

Declare @Table table (cat varchar(10), subcat varchar(10),  amount decimal(10,2))
Insert into @Table values
('a','x1',  1),
('a','x1',  1),
('a','x1',  1),
('a','x2',  4),
('a','x2',  4),
('a','x3',  6),
('a','x4',  3),
('a','x5',  7)

Select cat,SoA=sum(a.amount) from (Select Distinct * from @Table) A group by cat

返回

cat SoA
a   21.00

答案 2 :(得分:-1)

您可以使用子查询:

SELECT  cat,
        SUM(amount) as amount
FROM (
    SELECT  cat, 
            subcat, 
            AVG(amount) as amount
    FROM YourTable
    GROUP BY cat, subcat
    ) as p
GROUP BY cat

或CTE:

;WITH cte as (
    SELECT  cat, 
            subcat, 
            AVG(amount) as amount
    FROM YourTable
    GROUP BY cat, subcat
)

SELECT  cat,
        SUM(amount) as amount
FROM cte
GROUP BY cat

输出:

cat amount
a   21