Условный COUNT и GROUP BY? - PullRequest
       2

Условный COUNT и GROUP BY?

0 голосов
/ 15 мая 2019

У меня есть следующая таблица:

CREATE TABLE Source_Table
    ([Student_ID] varchar(10), [Class_ID] varchar(10), [Sport] varchar(10))
;

INSERT INTO Source_Table
    ([Student_ID], [Class_ID], [Sport])
VALUES
    ('S00001', 'C0123A', 'Football'),
    ('S00002', 'C0123A', 'Football'),
    ('S00003', 'C0123A', 'Football'),
    ('S00004', 'C0123A', 'Football'),
    ('S00005', 'C0111B', 'Basketball'),
    ('S00006', 'C0111B', 'Basketball'),
    ('S00007', 'C0211C', 'Basketball'),
    ('S00008', 'C0100D', 'Soccer'),
    ('S00009', 'C0100D', 'Soccer');

и я хотел бы получить следующий вывод:

Правило: для Class_ID, имеющего счет (Student_ID)> = 3, считать только один раз

Sport   Count
Basketball  3
Football    **1**
Soccer  2

Я пытался использовать GROUP BY Sport и COUNT (CLASS_ID), но не уверен, как реализовать правило.

http://www.sqlfiddle.com/#!18/3e6a3/3

select Sport, Count(Class_Id) from Source_Table
group by Sport

Вывод того, что я пробовал:

Sport   Count
Basketball  3
Football    **4** when I would like it to be Football **1**
Soccer  2

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Вы можете получить нужные результаты с помощью этого запроса. Он использует подзапрос для подсчета количества студентов для каждой комбинации Sport / Class_Id. Во внешнем запросе он суммирует счетчики, заменяя счет для класса, в котором участвуют 3 или более учеников, 1:

select Sport, SUM(CASE WHEN Count >= 3 THEN 1 ELSE Count END) AS Count
FROM (select Sport, Class_Id, Count(Student_Id) AS Count
      from Source_Table
      group by Sport, Class_Id) s
GROUP BY Sport

Выход:

Sport       Count
Basketball  3
Football    1
Soccer      2

Обновлен SQLFiddle

0 голосов
/ 15 мая 2019

Я думаю, что самый простой метод - это выражение case:

select Sport,
       (case when count(*) > 3 then 1 else count(*) end) as cnt
from Source_Table
group by Sport;

Если вам нужно подсчитать разных студентов, сделайте это:

select Sport,
       (case when count(distinct class_id) > 3 then 1 else count(*) end) as cnt
from Source_Table
group by Sport;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...