Среднее значение по строкам в SQL Server 2008

#sql #sql-server #sql-server-2008

#sql #sql-server #sql-сервер-2008

Вопрос:

У меня есть следующая таблица

 Data   Data1  Data2  YTD
-------------------------
1       2      3      
2       3      4     
3       3      6  
  

В YTD столбце я должен усреднить данные по строкам. Я могу использовать среднее значение по столбцам, но не уверен, как усреднить по строкам.

Ищем приведенные ниже результаты и используем SQL Server 2008

  Data   Data1  Data2  YTD
 ---------------------------------
    1       2      3   2 (Average)   
    2       3      4   3 
    3    null      6   4.5
  

Комментарии:

1. Конструктивная обратная связь: Я отклонил это за (а) постоянное добавление болтливых материалов и, пожалуйста, остановите меня, умоляя, несмотря на то, что это было удалено из ваших предыдущих сообщений, и (б) не прилагая усилий, чтобы попробовать какой-нибудь код, прежде чем задавать вопрос.

Ответ №1:

Я думаю, cross apply это самый простой метод:

 select t.*, v.avg_data
from t cross apply
     (select avg(v.data) as avg_data
      from (values (t.data), (t.data1), (t.data2)) v(data)
     ) v;
  

Используйте case выражения, вы также можете выразить это как:

 select t.*,
       ( (coalesce(t.data, 0)   (t.data1, 0)   coalesce(t.data2, 0)) /
         nullif( (case when t.data is not null then 1 else 0 end)  
                 (case when t.dat1 is not null then 1 else 0 end)  
                 (case when t.dat2 is not null then 1 else 0 end), 0
               )
       ) as avg_data;
  

Однако эта формулировка является беспорядочной и подвержена опечаткам.

Комментарии:

1. Лол Гордон спешит на помощь.. Чувак, когда ты работаешь … Кажется, ты всегда просто помогаешь другим.

2. @user1221989 . . . Я пишу документ. Это дает мне прекрасную возможность сделать паузу, чтобы подумать.

3. Гордон вместо того, чтобы получать его в виде инструкции select, как я могу обновить столбец основной таблицы с начала года средними значениями.

4. @user1221989 . . . Это другой вопрос, и его следует задать как новый.