我有一个缺少所有员工姓名的sql语句。
表employee_list包含公司的所有员工。
表应用包含分配给应用的员工
表详细信息包含订单的总金额
我的查询不会对没有任何应用的员工进行分组和总计。例如,员工约翰有5个应用程序,250美元,比尔有2个应用程序75美元,亨利有0个应用程序0美元(亨利的应用程序或详细信息表中没有行。)
我的查询返回:
John 5 250.00
Bill 2 75.00
我需要它返回
John 5 250.00
Bill 2 75.00
Henry 0 0.00
有什么想法吗?这是我目前的代码
SELECT employee_list.Fullname,
count(apps.acntnum),
sum(details.cost)
FROM employee_list
left join apps on employee_list.Fullname=apps.EmployeeName
LEFT JOIN details ON (apps.ID=details.ObjOwner_ID AND details.Active=1)
Group BY
employee_list.Fullname
答案 0 :(得分:2)
重要的是要使用employee_list表中的LEFT JOIN以及您要加入的任何后续表,并且不要做任何会从右侧表中过滤掉NULL的事情(因为NULL将用于'缺少'行。)
您的查询没问题,但我怀疑您在更广泛的查询中使用它,在那里您可能无意中有一个INNER JOIN或提到WHERE子句中的一个列。
答案 1 :(得分:0)
我同意所有其他答案,但是,你也可以尝试这个....
SELECT employee_list.Fullname,
(SELECT count(apps.acntnum) FROM apps WHERE employee_list.Fullname=apps.EmployeeName) AS Cnt,
(SELECT sum(details.cost) FROM apps LEFT JOIN details ON (apps.ID=details.ObjOwner_ID AND details.Active=1) WHERE employee_list.Fullname=apps.EmployeeName) AS cost
FROM employee_list
这将始终返回完整的员工列表,并分别对其他值进行计数/求和。 这个答案没有考虑到绩效。