Беспорядок SQL-запросов проблема с счетчиком (*) и несколькими таблицами - PullRequest
0 голосов
/ 27 октября 2018

Я абсолютный новичок в изучении баз данных.И я испортил свою проблему и понятия не имею, как ее решить.Любые советы приветствуются,

Вот мои две таблицы:

  • сотрудник: eid (строка)
  • информация: eid (строка), cid(строка), квартал (квартал), год (целое число)

  • eid: идентификатор сотрудника

  • cid: идентификатор курса (какой сотрудник принимает)
  • qtr: квартал (весна, зима, лето)

Info - это таблица, в которой содержится информация о том, какие курсы посещал каждый сотрудник, учитывая количество и год.И курс может быть взят только один раз.

Сотрудник может иметь пробелы в зачислении (нет необходимости проходить курс каждый квартал)

Мне нужно выяснить:

Списокколичество курсов за каждый квартал, которые по крайней мере один сотрудник прошел, но меньше, чем сотрудник прошел (и я хочу показать qtr, year, count (*))

Например, мой результат должен выглядеть следующим образом

qtr   year    num
-----------------
 W    2001     2
 W    2002     1
 F    2003     1

Вот мой код

select 
    a.qtr, a.year, a.count(*) AS num
from 
    info a 
where 
    (select * 
     from info b 
     where a.cid = b.cid and a.qtr = b.qtr and a.year = b.year and a.eid < b.eid)
group by  
    a.qtr, a.year
having 
    num > 0 and num < 3;

Ответы [ 2 ]

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

Начните с получения количества для каждого курса за каждый квартал:

select cid, qtr, count(*) as num_employees
from info i
group by cid, qtr;

Теперь вы хотите, чтобы те с количеством между определенными значениями. Это фильтрация после GROUP BY, поэтому вы используете предложение HAVING:

select cid, qtr, count(*) as num_employees
from info i
group by cid, qtr
having count(*) > 0 and  -- redundant because all courses have at least one student to be in the table
       count(*) < 3;
0 голосов
/ 27 октября 2018

Хорошо, это то, что вы можете сделать, во-первых, вы должны иметь возможность выбрать все отдельные кварталы за соответствующий год и просто получить счет. Как это может быть достигнуто так:

SELECT infor.qtr, infor.year , count(distinct(data_a.cid)) as Num
From infor
Inner Join
(SELECT distinct qtr, year, cid, count(eid) as EIDCount
    From infor
    Group by  qtr, year, cid
    having count(eid) >= 1 and count(eid) < 3) data_a
on infor.qtry = data_a.qtr and infor.year = data_a.year
group by infor.qtr, infor.year

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

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...