Подсчет записей с уникальным значением поля - PullRequest
0 голосов
/ 26 октября 2018

Исходная таблица

Предполагается, что у меня есть таблица с именем MyTable с содержанием:

+----------+------+
| Category | Code |
+----------+------+
|    A     | A123 |
|    A     | B123 |
|    A     | C123 |
|    B     | A123 |
|    B     | B123 |
|    B     | D123 |
|    C     | A123 |
|    C     | E123 |
|    C     | F123 |
+----------+------+

Я пытаюсь подсчитать количество Code значений, уникальных длякаждая категория.


Желаемый результат

Для приведенного выше примера результатом будет:

+----------+-------------+
| Category | UniqueCodes |
+----------+-------------+
|    A     |           1 |
|    B     |           1 |
|    C     |           2 |
+----------+-------------+

Поскольку C123 уникален для A,D123 уникален для B, а E123 & F123 уникален для C.


Что я пробовал

Я могуполучить результат для отдельной категории (например, C), используя запрос, такой как:

SELECT COUNT(a.Code) AS UniqueCodes
FROM 
    (
        SELECT MyTable.Code
        FROM MyTable
        WHERE MyTable.Category = "C"
    ) a
    LEFT JOIN
    (
        SELECT MyTable.Code
        FROM MyTable
        WHERE MyTable.Category <> "C"
    ) b
    ON a.Code = b.Code
WHERE b.Code IS NULL

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

Вот что я пробовал:

SELECT c.Category, 
    (
        SELECT COUNT(a.Code) 
        FROM 
            (
                SELECT MyTable.Code 
                FROM MyTable 
                WHERE MyTable.Category = c.Category
            ) a 
            LEFT JOIN
            (
                SELECT MyTable.Code
                FROM MyTable
                WHERE MyTable.Category <> c.Category
            ) b 
            ON a.Code = b.Code 
        WHERE b.Code IS NULL
    ) AS UniqueCodes
FROM
    (
        SELECT MyTable.Category
        FROM MyTable
        GROUP BY MyTable.Category
    ) c

Хотя c.Category не определен в рамках вложенного SELECT query.

Может кто-нибудь посоветовать, как мне получить желаемый результат?

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Изучая ответ @ isaace, я тоже придумал это -

SELECT MyTable.Category, COUNT(*)
FROM 
    MyTable INNER JOIN 
    (SELECT Code FROM MyTable GROUP BY Code HAVING COUNT(Category) = 1) a 
    ON MyTable.Code = a.Code
GROUP BY MyTable.Category
0 голосов
/ 26 октября 2018

Это также будет работать:

select category, count(*) from(
    select a.category,  b.count from mytable a join (
        select code, count(category) as count 
        from mytable 
        group by code 
        having count(category) = 1
    ) b on b.code = a.code
) c group by category
0 голосов
/ 26 октября 2018

Вы можете использовать два уровня агрегации:

select minc as category, count(*)
from (select code, min(category) as minc, max(category) as maxc
      from t
      group by code
     ) as c
where minc = maxc
group by minc;
0 голосов
/ 26 октября 2018

Я бы использовал NOT EXISTS и агрегировал:

select category, count(*)
from MyTable t
where not exists (select 1 from MyTable t1 where t1.code = t.code and t1.category <> t.category)
group by category;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...