Как найти среднее значение столбца, в котором есть строковые и числовые значения? - PullRequest
0 голосов
/ 22 января 2019

Я хочу вычислить средние два столбца, но каждый столбец содержит строковые значения между ними, и это создает ошибку при применении функции avg. Как я могу решить эту проблему?

Ответы [ 3 ]

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

Пример данных поможет;Я не уверен, что вы имели в виду, говоря, что вы хотите «вычислить средние два столбца» - это (COLUMN_1 + COLUMN_2) / 2 или AVG(COLUMN_1) и AVG(COLUMN_2)?

В любом случае, принцип тот же - проверьте, содержит ли столбец число, и выполните расчет.В противном случае ничего не делать.Например:

SQL> with test (col1, col2) as
  2    (select 'a2' , 'ccc' from dual union all
  3     select '100', '200' from dual union all
  4     select '15' , 'xx'  from dual
  5    )
  6  select col1,
  7         col2,
  8         case when regexp_like(col1, '^\d+$') and regexp_like(col2, '^\d+$') then
  9                   (to_number(col1) + to_number(col2)) / 2
 10              else null
 11         end average
 12  from test;

COL COL    AVERAGE
--- --- ----------
a2  ccc
100 200        150
15  xx

SQL>
0 голосов
/ 22 января 2019

Если вы хотите получить общее среднее значение в каждом столбце, то:

select avg(case when col1 like '^\d+$' then to_number(col1) end) as avg_col1,
       avg(case when col2 like '^\d+$' then to_number(col2) end) as avg_col2
from t;

avg() игнорирует значения NULL.

Если вы хотите получить среднее значение в строке, тогда avg() не подходит (это функция агрегации).В этом случае:

select (case when col1 like '^\d+$' and col2 like '^\d+$'
             then ( to_number(col1) + to_number(col2) ) / 2
             when col1 like '^\d+$'
             then to_number(col2)
             when col2 like '^\d+$'
             then to_number(col1)
        end) as avg_col1_2
from t;
0 голосов
/ 22 января 2019

Это может работать

Select (cast(col1 as float) + cast(col2 as float)) / 2 as average_between_col1_and_col2, 
        avg(cast(col2 as float)) as avg_col_2, 
        avg(cast(col1 as float)) as avg_col_1
from table tbl

В любом случае предоставьте полный пример с примерами данных, запросом желаемого результата и полученной ошибкой.

ПРИМЕЧАНИЕ В моем запросе предполагается, что оба столбца небыть числовым, но содержать цифры, если столбец уже числовой, вы можете опустить приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...