ОТКРЫТЬ С УСЛОВИЯМИ
Я хочу подсчитать количество отдельных элементов в столбце, подлежащих определенному условию, например, если таблица такова:
tag | entryID
----+---------
foo | 0
foo | 0
bar | 3
Если я хочу подсчитать количество различных тегов как "счетчик тегов" и подсчитать количество различных тегов с идентификатором вводa > 0 как "положительный счетчик тегов" в той же таблице, что мне делать?
Теперь я рассчитываю на две разные таблицы, где во второй таблице я выбрал только те строки с идентификатором entry больше нуля. Я думаю, что для решения этой проблемы должен быть более компактный способ.
Ответы
Ответ 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.