2张桌子-一位客户,一笔交易。如何处理没有交易的客户?

时间:2019-06-25 04:19:54

标签: sql sql-server

我有2个表,一个客户,一个交易。一位客户没有任何交易。我该如何处理?当我尝试加入表格时,没有交易的客户不会出现,如下面的代码所示。

SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName, Orders.TxnDate, Orders.Amount
FROM Orders
INNER JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;

我需要能够在没有交易(例如查询最小交易金额)的情况下为客户付款。

5 个答案:

答案 0 :(得分:2)

在下面的更新查询中使用-使用右外联接代替内联接来显示所有客户,而不管客户是否下订单。

 SELECT Orders.Customer_Id, Customers.AcctOpenDate, 
 Customers.CustomerFirstName, Customers.CustomerLastName, 
 Orders.TxnDate, Orders.Amount
 FROM Orders
 Right Outer JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;

答案 1 :(得分:0)

尝试:

 SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName, Orders.TxnDate, Orders.Amount
 FROM Orders
 Right OUTER JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;

答案 2 :(得分:0)

内部联接只显示两个表中都存在的记录

OUTER联接使SQL列出指定表中存在的所有记录,并为另一个表中不存在的字段显示NULL

左外联接(第一张桌子) 右外连接(第二张表) FULL OUTER JOIN(两个表的所有记录)

快速了解联接类型以及如何处理NULL,这是编写SQL脚本的90%。

以下是具有左联接的同一查询,如果没有记录,则使用ISNULL将数量列转换为0

SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName
, Orders.TxnDate, ISNULL(Orders.Amount,0)
FROM Customers
LEFT OUTER JOIN Orders ON Orders.Customer_Id=Customers.Customer_Id;

答案 3 :(得分:0)

我强烈推荐LEFT JOIN。这会将所有行保留在第一个表中,并将匹配的列保留在第二个表中。如果没有匹配的行,则这些列为NULL

SELECT c.Customer_Id, c.AcctOpenDate, c.CustomerFirstName, c.CustomerLastName,
       o.TxnDate, o.Amount
FROM Customers c LEFT JOIN
     Orders o
     ON o.Customer_Id = c.Customer_Id;

尽管您可以使用RIGHT JOIN,但我从未使用过RIGHT JOIN,因为我发现它们更难以理解。 “保留我读取的第一个表中的所有行”的逻辑相对简单。 “在读取最后一张表之前我不知道要保留哪些行”的逻辑很难理解。

还请注意,我包括了表别名,并将CustomerId更改为来自customers的位置,即您保留所有行的表。

答案 4 :(得分:0)

使用 CASE 会将 "null" 替换为 0,然后您可以对这些值求和。这将计算没有交易的客户。

SELECT c.Name,
SUM(CASE WHEN t.ID IS NULL THEN 0 ELSE 1 END) as TransactionsPerCustomer
FROM Customers c
LEFT JOIN Transactions t
    ON c.Name = t.customerID
group by c.Name