РОЗМІСТУВАННЯ КОНТАКТУ з УМОВАМИ


104

Я хочу порахувати кількість окремих елементів у стовпці, що залежать від певної умови, наприклад, якщо таблиця така:

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

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

Зараз я рахую з двох різних таблиць, де у другій таблиці я вибрав лише ті рядки, у яких вхідний ID більший за нуль. Я думаю, що має бути більш компактний спосіб вирішення цієї проблеми.

Відповіді:


258

Ви можете спробувати це:

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
Але тоді також буде виразним і позитивний_tag_count?
Дерех

Відредагований запит все ще не вирішує проблему - чи не зараз це працює над різними значеннями entryId, а не окремими тегами?
BrianC

Це справді розумне заспокоєння.
Люк

У мене є кілька стовпців у моєму відмітному (приклад кількість (окремий тег, дата)). Чи є спосіб мати кілька стовпців у тодішньому пункті. Якщо я просто роблю тег, дата його викидає виключення для розбору
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]

Перше поле буде тегом, друге - цілим підрахунком, третє - позитивним.


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 у лівій частині приєднання, а не в пункті де, щоб переконатися, що будь-які елементи, у яких є лише вхідний номер 0, належним чином підраховуються в першому DISTINCT.


1
Цей запит читає таблицю двічі. Це можна зробити, прочитавши таблицю лише один раз.
ntalbs

0

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

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

У висновку буде відображено кількість унікальних значень Сподіваюся, що це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.