【发布时间】:2019-10-22 15:44:10
【问题描述】:
我有四个表 customers、orders、orderitems 和 sales,我想获取每个客户的应付总额以及每个客户的余额。为此,我尝试了这个 SQL 查询:
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
SUM(oi.amount) AS Amount,
SUM(t2.balance) AS Balance
FROM orderitems oi
INNER JOIN orders o ON oi.orderid = o.id
INNER JOIN customers c ON o.customerid = c.id
INNER JOIN
(SELECT s.customerid,
SUM(s.balance) AS Balance
FROM sales s
INNER JOIN customers c ON s.customerid = c.id
GROUP BY s.customerid) t2 ON t2.customerid = c.id
WHERE o.status == 'Processing'
GROUP BY
c.id, c.contactnumber, c.location
它生成以下输出:
它正确计算了应付金额,但它计算了两次余额,因为两个客户的原始余额都是 100,但每个客户都显示 200。
另外请注意,订单有一个状态栏,如果订单金额到期,则显示“处理中”,如果有余额,则显示“未完成”。
表结构是:
订单:
销售:
订单项:
客户:
请帮忙。
【问题讨论】:
-
每个
Curstomer有多个ContactNumber还是多个Location? -
不,每个客户都有一条记录,当订单处理完毕时,我会在销售表中保存已支付的余额,并根据订单表中的余额将订单状态从处理更新为完成/未完成。
-
向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask
-
提示:为数据库问题“显示”架构的最佳方式是包含 CREATE TABLE 语句,而不是图像,尤其是链接图像。
-
每个客户有多少订单?是 2 吗?为什么你在加入 sum(balance) 的过程中,然后又在顶层做 sum。虽然不看数据很难确定,但在我看来,如果客户有多个订单项,这个查询是不正确的。