Агрегировать для подсчета значений, равных константе

В 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
Другие вопросы по тегам