2016-10-17 1 views
2

Как выбрать переменную, которая дает выход такой же, как функция первенствовать:Как сделать СЧЕТЕСЛИ() в Oracle

COUNTIFS(A1:D1,"<25", A1:D1, ">16")? 

И.Э. чтобы подсчитать количество раз значения в моих четырех полей между 16 и 25.

ответ

2

Вы можете сделать это с помощью count() и case выражений. Примечание: case имеет необязательное предложение else; если он не используется, то значение else по умолчанию - null. Count подсчитывает только ненулевые значения, поэтому вы можете комбинировать эти наблюдения для написания компактного кода. ЧТО подсчитано не имеет значения; поэтому выражение case может возвращать число (1 является обычным, но 0 является таким же правильным и даст тот же результат, поскольку значения COUNTED, а не SUMMED), но вы также можете иметь строку типа «x» или дату в выражении случая. Чтобы проиллюстрировать это, я буду использовать строку.

select count(case when col > 16 and col < 25 then 'x' end) as ct from your_table; 

Здесь your_table это имя вашей таблицы, col это имя столбца, содержащего значения, и ct это имя результирующего столбца (метка для подсчета значений, которые удовлетворяют условию).

Конечно, в базе данных вы можете получить тот же результат более легко:

select count(*) as ct from your_table where col > 16 and col < 25; 

Заметим, однако, что значения в одном столбце.

Если вместо этого у вас есть таблица с четырьмя столбцами и многими строками, а все значения во всех столбцах - это числа, и вы хотите добавить столбец, показывающий, сколько значений строго находится между 16 и 25 в каждом канале, решение отличается (но он использует одни и те же идеи):

select col1, col2, col3, col4, 
     case when col1 > 16 and col1 < 25 then 1 else 0 end + 
     case when col2 > 16 and col2 < 25 then 1 else 0 end + 
     case when col3 > 16 and col3 < 25 then 1 else 0 end + 
     case when col4 > 16 and col4 < 25 then 1 else 0 end as ct 
from my_table; 
1

Вы бы сделать это в запросе SQL с помощью case:

select sum(case when col between 16 and 25 then 1 else 0 end) 
from t; 

Обратите внимание, что between это включено в SQL, а не эксклюзив , поэтому на основе вашей логики кода:

select sum(case when col > 16 and col < 25 then 1 else 0 end) 
from t; 
0

Думают, у вас есть 'user_table', где некоторые из пользователя «статус» являются active (code-11) и другие inactive (code-22). Вы можете считать активным и неактивным с помощью этого sql ниже.

select count(case when status = 11 then 1 end) u_active, count(case when status = 22 then 1 end) u_inactive, from user_table;