Рассчитать среднее значение строки в SQL Server - PullRequest
0 голосов
/ 12 января 2019

У меня есть таблица ниже. Столбец процентов имеет тип nvarchar

Data  Percent1 Percent2 Percent3
1     3%        4%        6%
2     6%        8%        7%
3     8%        6%        8%

Я должен рассчитать среднее значение для каждой строки, чтобы получить такие результаты, как Data Avg

1    4.33%

Я пытался преобразовать столбец% в десятичную, чтобы я мог применить функцию усреднения

select
Case WHEN Isnumeric([Percent1]) = 1
THEN CONVERT(DECIMAL(18,2),Replace([Percent1],'%',''))
ELSE 0 END AS Percent1
from DashboardData

но я просто получаю 0 значений .. Я предполагаю, что внешняя функция по какой-то причине работает перед внутренней. Может кто-нибудь, пожалуйста, скажите мне, как я могу достичь этого.

Я знаю, что функция IsNumeric сделает это 0, но я пробовал это до этого, и я получал исключение, что тип не является числом.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 января 2019

SELECT ISNUMERIC('3%') вернет 0, как и все остальные ваши значения, поэтому ваше условие else всегда будет результатом.

Просто бросьте %

select
   data, 
   (replace(Percent1,'%','') + replace(Percent2,'%','') + replace(Percent3,'%','')) * 1.0 / 3

Обратите внимание, что если любое из этих значений равно NULL, вам необходимо учесть это, поскольку NULL + что-либо IS NULL.

Кроме того, вы не хотите опираться на ISNUMERIC слишком тяжелый ... это может дать некоторые результаты, которые вы, вероятно, не ожидаете

select 
    ISNUMERIC('$')      --money which is a numeric value
    ,ISNUMERIC('1e4')   --scientific notation
    ,ISNUMERIC('45D-1') --old scientific notation
    ,ISNUMERIC('.')     --just the decimal portion of a float / decimal
0 голосов
/ 12 января 2019

Это то, что вы хотите?

select dd.*, s.average      
from dashboarddata dd cross apply
     (select avg(try_convert(numeric(10, 2), replace(pc, '%', ''))) as average
      from values (percent1), (percent2), (percent3)) as v(pc)
     ) s;
...