Как я могу сложить группу сумм? SQL Server 2008 - PullRequest
4 голосов
/ 08 марта 2011

У меня есть запрос с 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.Спасибо всем, кто разместил правильный ответ, хотелось бы отметить их все!

Ответы [ 4 ]

4 голосов
/ 08 марта 2011

Вы пробовали:

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 не работает для меня, я упрощаю ad nauseam мой запрос до тех пор, пока причина его сбоя не станет очевидной.В этом ключе я бы попытался:

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

... и разрешил бы любые ошибки, которые появляются из следующего (и вложенного запроса!), Чтобы проинформировать меня о дальнейшем расследовании.

4 голосов
/ 08 марта 2011

Похоже, вам нужно сгруппировать по Table1.IDсгруппируйте другие нужные столбцы.

[ОБНОВЛЕНИЕ]

Демонстрационный код:

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
2 голосов
/ 08 марта 2011

Попробуйте это?

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
1 голос
/ 08 марта 2011

Вы пробовали вложенный выбор?

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
...