Подтвердить что ты не робот

Использование SUM() без группировки результатов

Я уже читал (это), но не смог найти способ реализовать его для моей конкретной проблемы. Я знаю, что SUM() является агрегированной функцией, и нет смысла не использовать ее как таковую, но в этом конкретном случае я должен SUM() выполнять все результаты при сохранении каждой отдельной строки.

Здесь таблица:

--ID-- --amount--
  1        23
  2        11
  3        8
  4        7

Мне нужно SUM() количество, но сохранить каждую запись, поэтому вывод должен выглядеть следующим образом:

--ID-- --amount--
  1        49
  2        49
  3        49
  4        49

У меня был этот запрос, но он суммирует только каждую строку, а не все результаты вместе:

SELECT 
    a.id,
    SUM(b.amount)

FROM table1 as a 
JOIN table1 as b ON a.id = b.id
GROUP BY id

Без SUM() он будет возвращать только одну строку, но мне нужно поддерживать все ID...

Примечание. Да, это довольно простой пример, и я мог бы использовать php для этого, но, очевидно, таблица больше и имеет больше строк и столбцов, но это не так.

4b9b3361

Ответ 1

SELECT a.id, b.amount
FROM table1 a
CROSS JOIN
(
    SELECT SUM(amount) amount FROM table1
) b

Вам нужно выполнить декартовое соединение значения суммы каждой строки в таблице для каждого id. Поскольку есть только один результат подзаголовка (49), он в основном просто привязывается к каждому id.

Ответ 2

С MS SQL вы можете использовать OVER()

 select id, SUM(amount) OVER()
 from table1;

select id, SUM(amount) OVER()
from (
  select 1 as id, 23 as amount
  union all
  select 2 as id, 11 as amount
  union all
  select 3 as id, 8 as amount
  union all
  select 4 as id, 7 as amount
) A

enter image description here

--- OVER PARTITION ID

PARTITION BY, что очень полезно, когда вы хотите сделать SUM() за МЕСЯЦ, например, или делать квартальные отчеты о продажах или ежегодно... (Примечание: нужно distinct, это делается для всех строк)

 select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION]
 from (
     select 1 as id, 23 as amount
     union all
     select 1 as id, 23 as amount
     union all
     select 2 as id, 11 as amount
     union all
     select 2 as id, 11 as amount
     union all
     select 3 as id, 8 as amount
     union all
     select 4 as id, 7 as amount
) OverPARTITIONID

enter image description here

Ответ 3

Присоедините исходную таблицу к сумме с подзапросом:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t

Ответ 4

Это делает только один запрос sum(), поэтому он должен выполнить ОК:

SELECT a.id, b.amount
FROM table1 a
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b