【问题标题】:COUNT() and Left Join not workingCOUNT() 和左连接不起作用
【发布时间】:2015-03-15 01:18:08
【问题描述】:

我在显示员工编号、名字、姓氏和每个员工的订单数量的查询时遇到问题。确保订单数列名称应为“OrderCount”。按 OrderCount 排序,然后按员工 ID 排序。允许为空。

employee_data 包含的列:Emp_IDF_NameL_Name

order_data 包含的列:O_ID,Emp_ID,OrderNumber

这是我的查询:

Select order_data.Emp_ID, F_Name, L_Name, COUNT(employee_data.Emp_ID) as OrderCount
FROM order_data
LEFT JOIN employee_data
ON employee_data.Emp_ID = order_data.Emp_ID
GROUP BY order_data.Emp_ID
ORDER BY OrderCount

这些是我的桌子:

员工数据

订单数据

输出应该是:

但它给了我这个错误的输入。

【问题讨论】:

  • 您遇到了什么问题(SQL 错误/错误结果)?
  • 首先:我假设没有指定客户的订单是不存在的。如果我是对的,那么您不需要使用 LEFT JOIN。只需使用 JOIN,因为 LEFT JOIN 明确允许employee_data 为空
  • 我得到了错误的结果。 @AbdulManaf
  • 正确加入,但我还是错了@ITroubs

标签: mysql sql select group-by left-join


【解决方案1】:

试试这个:

SELECT od.Emp_ID, ed.F_Name, ed.L_Name, COUNT(DISTINCT od.O_ID) AS OrderCount
FROM order_data od 
LEFT JOIN employee_data ed ON ed.Emp_ID = od.Emp_ID
GROUP BY od.Emp_ID
ORDER BY OrderCount

【讨论】:

  • 它没有给我空值,而是更多的零结果。
  • 成功了,谢谢!我只是稍微修改一下查询。
【解决方案2】:

聚合函数不能与查询中的其他字段一起使用。 可以在子查询中使用,如下:

Select order_data.Emp_ID, F_Name, L_Name, (select COUNT(employee_data.Emp_ID) from employee_data) as OrderCount
FROM order_data
LEFT JOIN employee_data
ON employee_data.Emp_ID = order_data.Emp_ID
GROUP BY order_data.Emp_ID
ORDER BY OrderCount

希望对您有所帮助.. :)

【讨论】:

  • 我要使用join吗?抱歉,我没听懂。
  • 您将使用子查询来获取计数。 count() 是一个聚合函数,您不能按照 SQL 语法选择具有其他字段的聚合函数。因此,要获得计数,您可以使用子查询。更新了我对您的案例的回答以使其清楚。 :) P.S:如果成功,您可以将此答案标记为已接受.. :)
  • 但是所有OrderCount 的值都是21。:)
  • 不是你想要的吗? Count() 将给出 all 表中 ID 的计数。现在我想你可能正在寻找行号。如果是这种情况,您将需要row_num。请具体说明相同的.. :)
【解决方案3】:

在您的查询中替换

ORDER BY OrderCount

ORDER BY order_data.Emp_ID

你的问题解决了......

【讨论】:

    【解决方案4】:

    我认为您的表格顺序错误:

    Select ed.Emp_ID, ed.F_Name, ed.L_Name, COUNT(od.Emp_ID) as OrderCount
    FROM employee_data ed LEFT JOIN
         order_data od
         ON ed.Emp_ID = od.Emp_ID
    GROUP BY ed.Emp_ID
    ORDER BY OrderCount;
    

    大概您想要所有员工,以及他们的员工人数。在正确维护的数据库中,订单表上不应有无效的员工 ID。

    【讨论】:

      【解决方案5】:

      您必须在 group by 子句中声明未在任何聚合函数中使用的列。尝试在 group by 子句中添加 'order_data.Emp_ID, F_Name, L_Name' 这些列。

      【讨论】:

        【解决方案6】:

        正如其他人所说,如果您不想拥有 NULL 值并且不想知道没有订单的员工,您可以使用联接...如果您需要非现有员工的订单(但是这可能工作),使用

        SELECT
          od.Emp_ID, ed.F_Name, ed.L_Name, COUNT(od.Emp_ID) as OrderCount
        FROM 
          order_data od
        LEFT JOIN 
          employee_data ed ON ed.Emp_ID = od.Emp_ID
        GROUP BY 
          od.Emp_ID
        ORDER BY 
          OrderCount, od.Emp_ID 
        

        您还缺少第二个 ORDER BY 值。

        【讨论】:

          猜你喜欢
          • 2015-12-02
          • 1970-01-01
          • 2012-09-10
          • 2019-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多