Подтвердить что ты не робот

ОТКРЫТЬ С УСЛОВИЯМИ

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

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

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

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

4b9b3361

Ответ 1

Вы можете попробовать следующее:

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 и не будут включены в счет.

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

Ответ 2

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

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

Ответ 3

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

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]

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

Ответ 4

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

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, чтобы убедиться, что все элементы, имеющие только идентификатор entry из 0, должным образом учитываются в первом DISTINCT.