【问题标题】:How can I sum a group of sums? SQL Server 2008我怎样才能总结一组总和? SQL Server 2008
【发布时间】:2011-07-11 05:13:40
【问题描述】:

我有一个带有sum 的查询,如下所示:

SELECT
    Table1.ID, SUM(Table2.[Number1] + Table2.[Number2]) AS SumColumn
FROM         Table1 INNER JOIN
                      Table3 ON Table1.ID = Table3.ID 
                    INNER JOIN
                      Table2 ON Table3.ID = Table2.ID
WHERE     (Table2.[Something] = 'Whatever')

GROUP BY Table1.ID,  Table2.[Number1] , Table2.[Number2]

它给了我一张这样的表格:

ID  SumColumn
67  1
67  4
70  2
70  6
70  3
70  6
80  5
97  1
97  3

我怎样才能让它给我一个这样的表,其中 SumColumn 被求和,按 ID 列分组?

ID   SumColumn
67   5
70   17
80   5
97   4

我不能GROUP BY SumColumn 因为我收到一个错误(无效的列名'SumColumn'。)COALESCE 也不起作用。提前致谢。

编辑:

仅按 ID 分组会给我一个错误:

[Number1、Number2 和我正在选择的其他列名] 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

编辑 2

不知道为什么,但现在似乎可以按 Table.ID 分组。感谢所有发布正确答案的人,我希望我能全部打勾!

【问题讨论】:

  • SELECT Table1.ID ....GROUP BY Table1.Att1 应该给出一个错误,即您无法选择 ID,因为它不在 GROUP BY 或聚合函数中 - 这些都是同一列并且您忘记更改一个在你的例子中?
  • RE:您最近编辑的错误是不言自明的,不是吗? SUM(Number1 + Number2) 没问题。 Number1, Number2 不是。
  • Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.

标签: sql-server-2008 group-by sum inner-join


【解决方案1】:

你试过了吗:

SELECT
    Table1.ID, SUM(Table2.[Number1] + Table2.[Number2]) AS SumColumn
FROM         Table1 INNER JOIN
                      Table3 ON Table1.ID = Table3.ID 
                    INNER JOIN
                      Table2 ON Table3.ID = Table2.ID
WHERE     (Table2.[Something] = 'Whatever')
GROUP BY Table1.ID

我不明白为什么上述方法行不通,除非您没有在查询中适当地对表进行别名,这更像是一种语法而不是逻辑错误,但无论如何从 SQL 引擎的角度来看都是“错误的”。每当 SQL 代码对我不起作用时,我会简化 令人作呕我的查询,直到它失败的原因变得明显。在这种情况下,我会尝试:

SELECT ID, SUM(sumCol) as SumColumn
FROM (
    SELECT
        Table1.ID, (Table2.[Number1] + Table2.[Number2]) AS sumCol
    FROM         Table1 INNER JOIN
                          Table3 ON Table1.ID = Table3.ID 
                        INNER JOIN
                          Table2 ON Table3.ID = Table2.ID
    WHERE     (Table2.[Something] = 'Whatever')
)
GROUP BY Table1.ID

...我会允许从以下(和嵌套查询!)中出现的任何错误通知我的进一步调查。

【讨论】:

  • @billynomates ...是的,看看新的和改进的答案:-)
  • 我不知道刚刚发生了什么。我开始像你说的那样进行简化,去掉内部的 SELECT 子句,看看它是否有效,但添加了 GROUP BY。就像你在第一个例子中所说的那样。有用!我看到的一切与我收到错误时没有什么不同,但无论如何非常感谢。对于其他阅读本文的人,我根本不需要嵌套的 SELECT 并且最初发布的每个人都是正确的。
  • @billynomates - 无法告诉您有多少次“非常好”的 SQL 没有运行,但是像侦探一样逐步调整代码最终完成了这项工作!
【解决方案2】:

听起来您只需要按 Table1.ID 进行分组。

SELECT
    Table1.ID, SUM(Table2.[Number1] + Table2.[Number2]) AS SumColumn
FROM         Table1 INNER JOIN
                      Table3 ON Table1.ID = Table3.ID 
                    INNER JOIN
                      Table2 ON Table3.ID = Table2.ID
WHERE     (Table2.[Something] = 'Whatever')

GROUP BY Table1.ID

由于 SUM() 是一个聚合函数,它将处理将数字分组在一起,您只需指定如何对所需的其他列进行分组。

[更新]

演示代码:

CREATE TABLE #T1(
    ID      INT
)
CREATE TABLE #T2 (
    ID              INT,
    Something       VARCHAR(32),
    Number1         INT,
    Number2         INT
)
CREATE TABLE #T3 (
    ID      INT
)
DECLARE @Index INT = 0

WHILE @Index < 50
BEGIN
    DECLARE @Something VARCHAR(32) = ''

    SET @Index = @Index + 1
    IF @Index BETWEEN 0 AND 15
        SET @Something = 'Blah'
    ELSE IF @Index BETWEEN 15 AND 40
        SET @Something = 'Whatever'
    ELSE IF @Index BETWEEN 40 AND 50
        SET @Something = 'Bleh'
    INSERT INTO #T1 VALUES(@Index)
    INSERT INTO #T3 VALUES(@Index)
    INSERT INTO #T2 VALUES(@Index, @Something, RAND()*100, RAND() * 100)
    INSERT INTO #T2 VALUES(@Index, @Something, RAND()*100, RAND() * 100)
    INSERT INTO #T2 VALUES(@Index, @Something, RAND()*100, RAND() * 100)
END

SELECT
    #T1.ID, SUM(#T2.Number1 + #T2.Number2) AS SumColumn
FROM         #T1 INNER JOIN
                      #T3 ON #T1.ID = #T3.ID 
                    INNER JOIN
                      #T2 ON #T3.ID = #T2.ID
WHERE     (#T2.Something = 'Whatever')
GROUP BY #T1.ID

【讨论】:

  • 嗯,这对我有用。我尝试复制错误,但无法复制。请参阅上面的示例。
【解决方案3】:

试试这个?

SELECT
    Table1.ID, SUM(Table2.[Number1] + Table2.[Number2]) AS SumColumn
FROM         Table1 INNER JOIN
                      Table3 ON Table1.ID = Table3.ID 
                    INNER JOIN
                      Table2 ON Table3.ID = Table2.ID
WHERE     (Table2.[Something] = 'Whatever')

GROUP BY Table1.ID

【讨论】:

    【解决方案4】:

    你试过嵌套选择吗?

    SELECT ID, SUM(SumColumn) AS SumColumn
    FROM (SELECT Table1.ID AS ID, SUM(Table2.[Number1] + Table2.[Number2]) AS SumColumn
          FROM Table1 
               INNER JOIN Table3 ON Table1.ID = Table3.ID 
               INNER JOIN Table2 ON Table3.ID = Table2.ID
          WHERE (Table2.[Something] = 'Whatever')
          GROUP BY Table1.ID,  Table2.[Number1] , Table2.[Number2])
    GROUP BY ID
    

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多