Использование 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 для этого, но, очевидно, таблица больше и имеет больше строк и столбцов, но это не так.
Ответы
Ответ 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