COUNT DISTINCT с УСЛОВИЯМИ

107

Я хочу подсчитать количество отдельных элементов в столбце при определенном условии, например, если таблица выглядит так:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

Если я хочу посчитать количество различных тегов как «количество тегов» и подсчитать количество отдельных тегов с идентификатором записи> 0 как «положительное количество тегов» в той же таблице, что мне делать?

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

дерехх
источник

Ответы:

260

Вы можете попробовать это:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

Первое count(distinct...)очень просто. Второй выглядит несколько сложным, на самом деле он такой же, как первый, за исключением того, что вы используете case...whenпредложение. В case...whenпредложении вы фильтруете только положительные значения. Нули или отрицательные значения будут оцениваться как nullи не будут включены в подсчет.

Здесь следует отметить, что это можно сделать, прочитав таблицу один раз. Когда кажется, что вам нужно прочитать одну и ту же таблицу дважды или больше, это можно сделать, прочитав один раз в большинстве случаев. В результате он выполнит задачу намного быстрее с меньшим количеством операций ввода-вывода.

ntalbs
источник
2
Но тогда будет ли положительное_тэг-счётчик отличаться?
derekhh
Отредактированный запрос по-прежнему не решает проблему - разве теперь он не работает с отдельными значениями entryId, а не с отдельными тегами?
BrianC
Это действительно умное решение.
Люк
У меня есть несколько столбцов в моем отдельном (примерное количество (отдельный тег, дата)). Есть ли способ иметь несколько столбцов в предложении then. Если я просто использую тег, дату, когда он выдает исключение синтаксического анализа
Crusaderpyro
@Crusaderpyro Это выходит за рамки исходного вопроса. Я бы создал для этого новый вопрос.
ntalbs
2

Попробуйте следующее утверждение:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

Первое поле будет тегом, второе - полным счетом, третье - положительным числом.

MJBLACKEND
источник
1

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

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

и

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag
заз
источник
0

Это также может сработать:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

Вам нужно условие entryID в левом соединении, а не в предложении where, чтобы гарантировать, что любые элементы, имеющие только entryID 0, правильно подсчитываются в первом DISTINCT.

BrianC
источник
1
Этот запрос читает таблицу дважды. Это можно сделать, прочитав таблицу только один раз.
ntalbs
0

Код считает уникальную / уникальную комбинацию тега и идентификатора записи, когда [Entry Id]> 0

select count(distinct(concat(tag,entryId)))
from customers
where id>0

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

Абхишек Гупта
источник