【问题标题】:SQL Server : select price of all orders made by the customerSQL Server:选择客户所有订单的价格
【发布时间】:2021-09-20 22:11:31
【问题描述】:

基本上,我有两个 SQL Server 表,CustomerOrders。我想针对每个客户显示客户信息和客户下的所有订单的价格。

客户表:

订单表:

数据库图:

这是我的选择功能,用于获取客户所有订单的价格。

select 
    Customer.CustomerID, 
    Customer.CustomerName, 
    Customer.CustomerAdress, 
    format(sum(Orders.Debit-Orders.Credit),'c', 'tr-TR') as Balance 
from 
    Customer 
join 
    Orders on Customer.CustomerID = Orders.CustomerID 
           and Customer.CustomerName = Orders.CustomerName 
group by 
    Customer.CustomerID, 
    Customer.CustomerName,   
    Customer.CustomerAdress

它工作正常。但是,新创建的客户还没有任何订单,并且此选择不会返回新创建的客户。

我想合并并显示没有任何订单的客户并将他们的余额设置为零。

【问题讨论】:

  • 在您的查询中将 JOIN 替换为 LEFT JOIN
  • 您的图片和 SSMS 标签表明您正在使用 SQL Server。我修复了数据库标签。标记您真正使用的数据库。

标签: sql sql-server select ssms


【解决方案1】:

如果要将所有行保留在一个表中,则需要外连接或相关子查询。

我还想指出使用表别名来简化查询的写入和读取:

select c.CustomerID, c.CustomerName, c.CustomerAdress, 
       format(sum(o.Debit - o.Credit), 'c', 'tr-TR') as Balance
from Customer c join
     Orders o
     on c.CustomerID = o.CustomerID and 
        c.CustomerName = o.CustomerName
group by c.CustomerID, c.CustomerName, c.CustomerAdress;

CustomerName 存储在orders 表中似乎很可疑。我希望CustomerId 成为Customers 的主键。这会使该名称充其量是多余的,并且在大多数情况下会成为错误的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2020-07-04
    • 2011-03-13
    • 2016-08-15
    • 2022-01-08
    • 2011-03-28
    • 2011-04-21
    相关资源
    最近更新 更多