#sql #sql-server #tsql #average #resultset
#sql #sql-server #tsql #среднее #набор результатов
Вопрос:
Допустим, у меня есть индексированное представление, в котором указывается количество дней, в течение которых люди останавливаются в отеле в данном месяце. При создании отчета я хочу вставить в свой результирующий набор строку, которая показывает среднее количество дней за все месяцы.
Мое индексированное представление выглядит следующим образом:
NumMonth | NumPeople | NumDays
1 | 4 | 3
1 | 4 | 4
2 | 1 | 9
3 | 3 | 6
3 | 2 | 10
Как я могу выбрать среднюю продолжительность пребывания в одной строке?
Мой текущий запрос выглядит примерно так:
INSERT INTO @results(month1, month2, month3, quarter1)
SELECT
'month1' = ISNULL(CASE WHEN v.NumMonth = 1
THEN convert(decimal(10,3), sum(v.NumPeople * v.NumDays)) / convert(decimal(10,3), sum(v.NumPeople))
ELSE null END, 0),
'month2' = ISNULL(CASE WHEN v.NumMonth = 2
THEN convert(decimal(10,3), sum(v.NumPeople * v.NumDays)) / convert(decimal(10,3), sum(v.NumPeople))
ELSE null END, 0),
'month3' = ISNULL(CASE WHEN v.NumMonth = 3
THEN convert(decimal(10,3), sum(v.NumPeople * v.NumDays)) / convert(decimal(10,3), sum(v.NumPeople))
ELSE null END, 0),
'quarter1' = ISNULL(CASE WHEN v.NumMonth = 1 OR v.NumMonth = 2 OR v.NumMonth = 3
THEN convert(decimal(10,3), sum(v.NumPeople * v.NumDays)) / convert(decimal(10,3), sum(v.NumPeople))
ELSE null END, 0)
FROM MonthTotalsView v with(noexpand)
Я получаю сообщение об ошибке, что список выбора недействителен, потому что мой NumMonth не агрегирован или не сгруппирован. Но я хочу, чтобы все это было в одной строке, а не разбито по месяцам. Любая помощь будет принята с благодарностью.
Результаты, которые я ищу, следующие:
month1 | month2 | month3 | quarter1
2.5 | 9 | 7.6 | 5.357
Комментарии:
1. Отредактируйте свой вопрос и предоставьте нужные результаты.
2. Какую СУБД вы используете?
3. Я использую SSMS 2016
Ответ №1:
Как я могу выбрать среднюю продолжительность пребывания в одной строке?
Предполагая, что ваши данные представляют одну строку за время пребывания:
select avg(numdays)
from MonthTotalsView;
Если вы хотите это в месяц:
select nummonth, avg(numdays)
from MonthTotalsView
group by nummonth;
Комментарии:
1. Я обновил свой вопрос, чтобы показать, что я ищу. Спасибо.