【问题标题】:Subquery Connecting unique ID to name trouble子查询连接唯一ID来命名麻烦
【发布时间】:2019-09-11 06:44:39
【问题描述】:

我有两张桌子有问题。我正在尝试查找在 2018 年分配了超过 3 名员工的飞行员的姓名。

出租车驾驶台

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

【问题讨论】:

    标签: sql group-by subquery mysql-workbench


    【解决方案1】:

    你想在这方面做什么?:

        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
    

    这将返回一个数字(因为计数),但不会与分配的 ID 匹配。

    【讨论】:

    • 您好,除了他们被雇用的次数之外,我正在尝试提取他们的名字和姓氏。
    【解决方案2】:

    在那种情况下,它会是这样的(我没有测试它):

    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
    ;
    

    【讨论】:

    • 这是在正确的轨道上,但是计数显示为空。
    【解决方案3】:
    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
    

    虽然没试过。

    【讨论】:

      【解决方案4】:

      首先,您的想法是正确的,但您的子查询不只与一个飞行员相关。你只是抓住了日期之间的所有任务,但与哪个飞行员没有相关性。所以你可以在所有飞行员中计算出 273 人。

      相反,您可以在子查询中添加飞行员 ID,然后在该子查询之外加入。这样,您就不会试图拉动所有飞行员。得到那些合格的,然后得到名字。

      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
      

      【讨论】:

        【解决方案5】:

        如果您选择日期,我认为简单的聚合将起作用。 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多