#sql-server #tsql
Вопрос:
Допустим, у меня есть этот запрос ниже, который выбирает все сектора и получает значение, когда дата приходится на любую из этих 3 дат, указанных в WHERE
предложении.
SELECT
Sector
,Val
FROM [Consumption] upc
WHERE upc.PeriodStart = '2020-12-07 17:00:00'
OR upc.PeriodStart = '2021-01-07 17:30:00'
OR upc.PeriodStart = '2021-02-10 18:00:00'
Текущий Результат:
Sector Val
Retail 53.4
Retail 58.1
Retail 60.5
Commercial 58.2
Commercial 60.6
Commercial 53.5
Как бы я мог получить среднее значение между значениями, сгруппированными по секторам, умноженное на 2, чтобы результат выглядел следующим образом?
ожидаемый результат:
Sector Val AvTot
Retail 53.4 114.67
Retail 60.5 114.67
Retail 58.1 114.67
Commercial 58.2 114.87
Commercial 60.6 114.87
Commercial 53.5 114.87
Комментарии:
1. Есть ли причина для включения
val
в группу by?2. Вы исказили свой первый запрос и случайно пропустили среднее значение по совокупности? Если нет, объясните, почему в нем есть предложение GROUP BY.
3. Моя ошибка, это была часть подзапроса, изначально он не предназначался для этого примера. Я удалил его
Ответ №1:
Окно AVG()
возвращает ожидаемые результаты:
SELECT Sector, Val, AVG(Val * 2) OVER (PARTITION BY Sector) AS AvgTotal
FROM (VALUES
('Retail', 53.4),
('Commercial', 58.2),
('Retail', 60.5),
('Commercial', 60.6),
('Commercial', 53.5),
('Retail', 58.1)
) [Consumption] (Sector, Val)
ORDER BY Sector
Результат (без округления и/или приведения):
Sector Val AvgTotal
--------------------------
Commercial 58.2 114.866666
Commercial 60.6 114.866666
Commercial 53.5 114.866666
Retail 60.5 114.666666
Retail 58.1 114.666666
Retail 53.4 114.666666
Комментарии:
1. Оконная функция AVG() работает вместе с подзапросом, а не с явным указанием значений, но да, это также работает
2. @mdbuzzer явно указанные значения-это просто способ представления набора данных без явного создания таблицы. Если вам нужны ответы, которые всегда ссылаются на ваши таблицы, помогите нам, создав пример таблицы в базе данных<>fiddle<> .