【问题标题】:Using Count and Sum at same time?同时使用计数和求和?
【发布时间】:2021-02-12 20:55:11
【问题描述】:

我正在尝试创建一个查询,我想从一个表中选择员工,从另一个表中计算他们的证书数量,总和,然后显示那些拥有超过 3 个证书的人。我试过了:

SELECT CONCAT (
        employee_bt.EMP_FNAME
        ," "
        ,employee_bt.EMP_LNAME
        ) AS "Full Name"
    ,count(earnedrating_bt.RTG_CODE) AS "Count of Rating"
FROM employee_bt
INNER JOIN earnedrating_bt ON earnedrating_bt.EMP_NUM = employee_bt.EMP_NUM
INNER JOIN rating_bt ON rating_bt.RTG_CODE = earnedrating_bt.RTG_CODE
GROUP BY employee_bt.EMP_NUM
    ,earnedrating_bt.RTG_CODE
ORDER BY employee_bt.EMP_LNAME ASC

但它会返回类似这样的结果,理想情况下,我只想将这些员工加起来,而不是 3 行,每行 1,我想要 1 行,它只是说 3。

Jeanine Duzak   1
Jeanine Duzak   1
Jeanine Duzak   1
John Lange      1
John Lange      1
John Lange      1
Rhonda Lewis    1
Rhonda Lewis    1
Rhonda Lewis    1
Rhonda Lewis    1

应该变成:

Jeanine Duzak   3
John Lange      3
Rhonda Lewis    4

【问题讨论】:

    标签: mysql sql count inner-join aggregate-functions


    【解决方案1】:

    如果您希望每个员工姓名有一行,那么这应该是 GROUP BY 中的唯一列:

    group by employee_bt.EMP_NUM
    

    我建议将查询编写为:

    select concat(e.EMP_FNAME, ' ', e.EMP_LNAME) as Full_Name,
           count(*) as rating_count
    from employee_bt e join
         earnedrating_bt er
         on er.EMP_NUM = e.EMP_NUM 
    group by e.EMP_NUM
    order by e.EMP_LNAME asc;
    

    注意事项:

    • JOINrating 似乎不需要计数。
    • 表引用被分配了别名。这样可以更轻松地编写和读取查询。
    • 为您的列命名,这样它们就不需要转义了。
    • 对字符串使用单引号。不要将字符串与标识符混淆!
    • GROUP BY 列与SELECT 列不一致。假设 EMP_NUM 是 employees 表的主键,这没关系——这是一个合理的假设。

    【讨论】:

      【解决方案2】:

      只需更改group by 子句:

      group by employee_bt.EMP_NUM, earnedrating_bt.RTG_CODE
      

      收件人:

      group by employee_bt.EMP_NUM
      

      这保证每个EMP_NUM 有一行。要使其正常工作,您需要 EMP_NUM 成为 employee_bt 表的主键。否则,您需要在group by 子句中添加emp_fnameemp_lname

      您也可以使用相关子查询来表达这一点:

      select concat(e.emp_fname, ' ', e.emp_lname) as full_name,
          (
              select count(*)
              from earnedrating_bt er
              inner join rating_bt r on r.rtg_code = er.rtg_code
              where er.emp_num = employee_bt.emp_num
          ) count_of_rating
      from employee_bt e
      order by e.emp_lname asc
      

      【讨论】:

        【解决方案3】:

        如果您对 RTG 代码是什么不感兴趣,我认为您只需按员工分组,只需对数字感兴趣即可。

        这行得通吗?

        select
        concat(employee_bt.EMP_FNAME, " ",employee_bt.EMP_LNAME) as "Full Name",
        count(earnedrating_bt.RTG_CODE) as "Count of Rating"
        
        
        from employee_bt
        
        inner join earnedrating_bt on earnedrating_bt.EMP_NUM=employee_bt.EMP_NUM
        inner join rating_bt on rating_bt.RTG_CODE=earnedrating_bt.RTG_CODE
        
        
        group by employee_bt.EMP_NUM
        HAVING count(earnedrating_bt.RTG_CODE) >=3
        order by employee_bt.EMP_LNAME asc
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 2018-09-19
          相关资源
          最近更新 更多