Среднее значение SQL для подмножества подсчета

#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. Я обновил свой вопрос, чтобы показать, что я ищу. Спасибо.