Подзапрос Подключение уникального идентификатора для определения проблемы - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть две таблицы в вопросе. Я пытаюсь найти имена пилотов, которым в 2018 году было назначено более 3 человек.

Таблица таксиPilot

p_id  p_lname  p_fname  p_city  
043   Smith    John     Dayton
044   Doe      Jane     Cincinnati

Таблица назначений

p_id  AT_id   HireNo  AssignDate  City
043   BU78    1       11/29/2018  Dayton
044   BU89    2       11/29/2018  Akron

Это только краткий пример данных, которые у меня есть.

Я пробовал следующее

select p_fname, p_lname
from taxiPilot tp
join assignment a on tp.p_id = a.p_id
where a.p_id IN (Select count(a.p_id)
from assignment
where AssignDate between "01/01/2018" and "12/31/2018"
group by a.p_id
having count(a.p_id) > 3);

В результате получается пустая таблица

Я ожидаю получить следующее

p_fname  p_lname  count(a.p_id)
Joe      Smith    5

Ответы [ 5 ]

1 голос
/ 22 апреля 2019

в этом случае это будет что-то вроде этого (я не проверял):

select p_fname, p_lname, (Select count(a.p_id)
from assignment
where AssignDate between "01/01/2018" and "12/31/2018"
group by a.p_id
having count(a.p_id) > 3)
from taxiPilot tp
join assignment a on tp.p_id = a.p_id
;
0 голосов
/ 22 апреля 2019

Во-первых, вы выбрали правильную идею, но ваш подзапрос не был связан с одним пилотом. Вы только что взяли все задания между датами, но не имели отношения к какому пилоту. Таким образом, вы могли иметь счет 273 на всех пилотов.

Вместо этого вы можете добавить идентификатор пилота в подзапросе, а затем присоединиться за пределами этого. Таким образом, вы не пытаетесь тянуть всех пилотов. Получить те, которые имеют право, ТОГДА получить имена.

select
      tp.p_fname,
      tp.p_lname,
      PQ.NumHires
   from
      ( select a.p_id, count(*) NumHires
           from Assignment a
           where a.AssignDate between '2018-01-01' and '2018-12-31'
           group by a.p_id 
           having count(*) > 3) PQ
         JOIN taxiPilot tp
            on PQ.p_id = tp.p_id
   order by
      tp.p_lname,
      tp.p_fname
0 голосов
/ 22 апреля 2019
with paste as (
select 
p_id, count(a.p_id) 
from assignment
group by 1
having count(*) > 3
)

select p_lname,  p_fname, max(HireNo)
from taxiPilot 
where p_id in (select p_id from paste)
group by 1, 2

Хотя не пробовал.

0 голосов
/ 22 апреля 2019

Я думаю, что простая агрегация сработает, если вы приведете даты. dbfiddle

select p_fname, p_lname, count(*)
  from taxiPilot tp 

join assignment a 
  on tp.p_id = a.p_id

where a.AssignDate between CAST('2018-01-01' AS DATETIME) 
                       and CAST('2018-12-31' AS DATETIME)
group by p_fname, p_lname
having count(*) > 3
0 голосов
/ 22 апреля 2019

что вы пытаетесь сделать с этим?:

    Select count(a.p_id)
from assignment
where AssignDate between "01/01/2018" and "12/31/2018"
group by a.p_id
having count(a.p_id) > 3

это вернет номер (из-за количества), но не совпадет с идентификатором назначения.

...