MySQL возвращает общее значение COUNT каждого значения в столбце

У меня есть таблица соискателей с тремя столбцами

JOBSEEKER ID, EMPLOYER ID, HIRING STATUS

Каждый соискатель может иметь различный статус найма для каждого работодателя в зависимости от собеседования. Теперь я хочу вернуть СЧЕТ каждого итогового СТАТУСА НАЙМА, но он должен учитывать только самый высокий уровень найма соискателя.

Скажите, что Джон был оценен как КВАЛИФИЦИРОВАННЫЙ работодателем 1 и НАЙДЕН работодателем 2 Джон будет засчитан только при наивысшем статусе найма, который он получил, который НАЙДЕН работодателем 2 и не должен учитываться при КВАЛИФИЦИРОВАНИИ.

HIRED: 1
QUALIFIED: 0
NEAR HIRED: 0
NOT QUALIFIED: 0

Вот мой стол

| Jobseeker Id | Employer Id | hstatus_id       |
|--------------|-------------|------------------|
|       1      | 2           | 1(Hired)         |
|       2      | 3           | 1(Hired)         |
|       2      | 4           | 3(Near Hire)     |
|       3      | 4           | 4(Not Qualified) |
|       1      | 2           | 2(Qualified)     |
|       3      | 3           | 1(Hired)         |
|       4      | 2           | 3(Near Hire)     |

и результат, который я хочу,

| Hiring Status | COUNT |
|---------------|-------|
|     Hired     | 3     |
|   Qualified   | 0     |
|   Near Hire   | 1     |
| Not Qualified | 0     |

Спасибо, извините за плохой английский.

Всего 2 ответа


Вам необходимо hStatus_table объединение таблицы hStatus_table с запросом, который возвращает минимальное целочисленное значение hiringstatus для каждого hiringstatus jobseekerid :

select s.hiringstatus, count(t.jobseekerid) counter
from hStatus_table s
left join (
  select jobseekerid, min(hstatus_id) hstatus_id
  from tablename
  group by jobseekerid
) t on t.hstatus_id = s.id
group by s.id, s.hiringstatus

Я предполагаю, что таблица hStatus_table выглядит так:

| ID  | HiringStatus  |
| --- | ------------- |
| 1   | Hired         |
| 2   | Qualified     |
| 3   | Near Hire     |
| 4   | Not Qualified |

Смотрите демо .
Результаты:

| hiringstatus  | counter |
| ------------- | ------- |
| Hired         | 3       |
| Qualified     | 0       |
| Near Hire     | 1       |
| Not Qualified | 0       |

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

select hiring_status, sum(seqnum = 1)
from (select js.*,
             row_number() over (partition by Jobseeker_id order by hiring_status desc) as seqnum
      from jobseekers js
     ) js
group by hiring_status;

Это предполагает, что hiring_status является либо числом, либо строкой, которая начинается с соответствующих цифр.

Это также предполагает, что все значения hiring_status находятся в jobseekers .

РЕДАКТИРОВАТЬ:

Если идентификаторы хранятся в другой таблице, вы просто используете left join :

select hs.*, count(js.job_seeker)
from hstatus_table hs left join
     (select js.job_seeker, max(hs.hiring_status_id) as max_hiring_status_id
      from jobseekers js
      group by js.job_seeker
     ) js
     on hs.hiring_status_id = max_hiring_status_id
group by hs.hiring_status_id;

Есть идеи?

10000