SQL Server 2张表--一个客户,一笔交易,如何处理没有交易的客户?

li9yvcax  于 2023-02-07  发布在  其他
关注(0)|答案(6)|浏览(166)

我有两个表-一个客户,一个事务。一个客户没有任何事务。我该如何处理这个问题?当我尝试联接我的表时,没有事务的客户没有显示,如下面的代码所示。

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;

我需要能够说明客户没有交易,如查询最低交易金额。

gjmwrych

gjmwrych1#

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

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;
uplii1fm

uplii1fm2#

内部连接仅显示两个表中都存在的那些记录
OUTER连接使SQL列出指定表中存在的所有记录,并为另一个表中不存在的字段显示NULL
左外联接(第一个表)右外联接(第二个表)完整外联接(两个表的所有记录)
掌握连接类型和如何处理NULL,这是编写SQL脚本的90%。
下面是使用左连接的同一查询,如果amount列没有记录,则使用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;
dbf7pr2w

dbf7pr2w3#

试试这个:

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;
ru9i0ody

ru9i0ody4#

我强烈推荐使用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--保存所有行的表。

ie3xauqp

ie3xauqp5#

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

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
efzxgjgh

efzxgjgh6#

SELECT c.Name,SUM(CASE WHEN t.ID IS NULL THEN 0 ELSE 1 END)作为交易编号FROM客户c LEFT JOIN交易t ON c.Name = t.客户ID按c.Name分组

相关问题