SQL 4表内连接也拾取和空值?

标签 sql sql-server inner-join multiple-tables

我有 4 个表......员工、客户、订单和订单信息。我正在尝试内部连接 ​​4 个表来汇总订单金额并根据 7% 计算员工佣金。我非常接近解决这个问题,但我有一个小问题:我没有得到所有员工,因为显示的员工数量少于我的员工表中的员工数量。这就是我目前编写查询的方式:

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 计算出来的。

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

最佳答案

试试这个:

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 更改为 LEFT JOIN,因为正如您所说,员工记录应该在那里,他们只是可能没有链接的订单。

您可能还需要使用 ISNULL([field_name], 0) 封装 NULL PriceEach、costEach、quantityOrdered 和 quantOrdered 值,以便为那些没有任何订单的员工获得正确的结果。

关于SQL 4表内连接也拾取和空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883126/

相关文章:

SQL - 当过滤器值为空时选择全部

mysql - 根据另一个表中的主键查找设置新列值

添加联接后 SQL 行消失

mysql - 在不同于 MySQL 的 MS SQL Server 中更新内部连接?

SQL while 循环与临时表

sql - SSIS 表达式

sql - sql server 2008分组时获取相关字符串数据

c# - SQLException (0x80131904) : Invalid object name 'dbo.Categories'

c# - 如何给 ADO.NET 参数

sql - 识别整个数据库中复合 PK 中包含的所有列