SQL Server: ошибка при попытке использовать СУММ в операторе SELECT

У меня есть этот sql-запрос, в котором я хочу получить сумму продаж в августе 2005 года. Каждый раз, когда я запускаю его, я получаю сообщение об ошибке «Столбец недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в Предложение GROUP BY ". Как я могу исправить это, чтобы отображались все столбцы и отображалась сумма в моем столбце repsales.amount?

SELECT *, SUM(repsales.amount) AS amount 
FROM repsales
WHERE repsales.saledate BETWEEN '2005-08-01' AND '2005-08-31'
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
630
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать оконные функции:

SELECT rs.*, SUM(rs.amount) OVER () AS total_amount 
FROM repsales rs
WHERE rs.saledate BETWEEN '2005-08-01' AND '2005-08-31';

Мой ответ - использование SUM в качестве аналитической / оконной функции. Это означает, что каждой строке будет присвоено значение, в отличие от использования SUM с GROUP BY, где происходит агрегирование строк.

Использование SUM(amount) OVER () определяет окно как всю таблицу. То есть сумма будет общей суммой суммы.

Вы можете мне объяснить, что делает пункт OVER? Никогда раньше не пользовался.

policy_wizard 16.11.2018 05:11

Другое альтернативное решение - указать имена столбцов по одному в операторах select и groupby. I.E. в приведенном ниже примере группируются по отделам и категориям на основе данных:

select rs.department,rs.category,sum(rs.amount) as SumAmount
from repsales rs
where rs.saledate BETWEEN '2005-08-01' AND '2005-08-31';
group by rs.department, rs.category

Если вам нужны все столбцы, вы можете сохранить набор результатов вышеприведенного запроса во временной таблице (выберите ... в #temp из ...) и использовать его следующим образом:

select rs.*,t.SumSmount
from repsales rs
inner join #temp t on t.department=rs.department and t.category=rs.category

вставить сумму суммы во временную таблицу с уникальными значениями столбцов dept, category и т. д.

Select rs.salespersonID, rs.OtherUniqueColumes, Sum(rs.amount) AS Amout
INTO #tempSales FROM repsales
WHERE repsales.saledate BETWEEN '2005-08-01' AND '2005-08-31'
Group By rs.salespersonID, rs.OtherUniqueColumes

присоединитесь к временной таблице с исходной таблицей, чтобы получить все остальные столбцы

SELECT rs.*, t.Amount
FROM repSales rs INNER JOIN #tempSales t on rs.salespersonID = t.salespersonID AND rs.OtherUniqueColumes = t.OtherUniqueColumes

DROP TABLE #tempSales

Другие вопросы по теме