У меня есть этот 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'


Вы можете использовать оконные функции:
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 () определяет окно как всю таблицу. То есть сумма будет общей суммой суммы.
Другое альтернативное решение - указать имена столбцов по одному в операторах 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
Вы можете мне объяснить, что делает пункт OVER? Никогда раньше не пользовался.