2016-11-30 34 views
2

我有4个表....员工,客户,订单和Order_Info。我试图内部加入4张表来总结订单金额,并根据7%计算员工佣金。我非常接近解决这个问题,但我有一个小问题:我没有得到所有员工,因为我的Employees表中显示的数量少于现有数量。这就是我现在有我的查询写:SQL 4表内部连接捡取总数也为零?

SELECT Employees.lName, Employees.fName, 
     SUM(quantOrdered * costEach) AS ttl_orders_value, 
     (SUM(quantOrdered * costEach) * .07) AS Commission 
FROM Customers 
INNER JOIN Employees ON Customers.empNumber = Employees.empNumber 
INNER JOIN Orders ON Customers.custNumber = Orders.custNumber 
INNER JOIN Order_Info ON Orders.ordNumber = Order_Info.ordNumber 
GROUP BY Employees.lName, Employees.fName 
ORDER BY Employees.lName, Employees.fName 

我希望得到即使从NULLS计算佣金和销售总额等于零,我相信所有的员工。

任何帮助改善我的查询将不胜感激!

+2

尝试使用LEFT JOIN而不是INNER JOIN。 – jarlh

+0

没有工作,它给了我一个额外的行在每列填充NULL。甚至在lName和fName都为空的情况下... – finiteloop

+0

添加一些示例表格数据以及当前结果和预期结果 - 所有以及格式化文本。 – jarlh

回答

2

试试这个:

SELECT Employees.lName, Employees.fName, 
     SUM(ISNULL(quantityOrdered,0) * ISNULL(priceEach,0)) AS ttl_orders_value, 
     (SUM(ISNULL(quantOrdered,0) * ISNULL(costEach,0)) * .05) AS Commission 
FROM Employees 
LEFT JOIN Customers ON Customers.empNumber = Employees.empNumber 
LEFT JOIN Orders 
    INNER JOIN OrderDetails ON Orders.ordNumber = OrderDetails.ordNumber 
ON Customers.custNumber = Orders.custNumber 
WHERE Employees.workTitle = 'Developer' 
GROUP BY Employees.lName, Employees.fName 
ORDER BY Employees.lName, Employees.fName 

注意,我已经改变了INNER JOIN到左,因为像你说的员工的记录应该是只存在于JOIN Orders表,他们只可能没有链接的订单。

您可能还需要用ISNULL([field_name],0)包装NULL priceEach,costEach,quantityOrdered和quantOrdered值以获得没有任何订单的员工的正确结果。

+0

这给了我相同的结果 – finiteloop

+0

我将如何执行该Wrap? – finiteloop

+0

@finiteloop查看更新后的答案,我修改了连接到OrderDetails并添加了ISNULL包装。 – andrews