Агрегировать для подсчета значений, равных константе
В SQL есть выразительный способ подсчитать, сколько значений отличается от 'x'
:
SELECT COUNT(NULLIF(col, 'x')) FROM table
Я считаю менее элегантным считать значения, равные 'x'
:
SELECT COUNT(*) - COUNT(NULLIF(col, 'x')) FROM table
SELECT SUM(CASE WHEN col = 'x' THEN 1 ELSE 0 END) FROM table
- [оракул]
SELECT COUNT(DECODE(col,'x','x',NULL)) FROM table
Есть ли более элегантный способ сделать это?
3 ответа
Решение
SELECT
COUNT(CASE WHEN col='x' THEN 1 END) AS XCount,
COUNT(CASE WHEN col='y' THEN 1 END) AS YCount,
COUNT(CASE WHEN col='z' THEN 1 END) AS ZCount
FROM table
Прямой способ состоит в том, чтобы сделать фильтрацию в WHERE
пункт:
SELECT COUNT(*) FROM table WHERE col = 'x'
РЕДАКТИРОВАТЬ:
Если вы не можете использовать предложение where (поскольку вы выполняете несколько подсчетов в одном и том же SELECT), то я думаю, что предложенные вами способы являются самыми элегантными. Мое личное предпочтение было бы SUM(CASE WHEN...
,
Вкус - вещь очень личная, мне нравится использовать этот синтаксис в Oracle:
select sum(decode(text,'x',0,1))
from table