我有四个表的客户,订单,订单项和销售,我想获取每个客户的应付总额以及每个客户的余额。为此,我尝试了以下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。
还请注意,订单有一个状态列,如果订单金额到期,该列将显示“正在处理”,如果余额尚余,则将显示“未完成”。
表结构为:
订单:
销售:
OrderItems:
客户:
请帮助。
答案 0 :(得分:0)
您正在对外部查询中的余额求和,但不应这样做,因为它是在子查询中求和的。您可以通过天平进行分组(这不是很好的设计理论,但是可以起作用);或者您可以对sum(amount)进行单独的子查询,然后 then 加入余额而不进行分组。
render(h) {
return (
<AjaxLoader url="/api/fetch/some/data">
{(props) => <div> {props.result} </div>}
</AjaxLoader>
);
},
作为2个子查询:
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
SUM(oi.amount) AS Amount,
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 customerid, SUM(balance) AS Balance
FROM sales
GROUP BY customerid
) t2 ON t2.customerid = c.id
WHERE o.status == 'Processing'
GROUP BY c.id, c.contactnumber, c.location, c.name, t2.balance
答案 1 :(得分:0)
这行吗?
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
SUM(oi.amount) AS Amount,
SUM(s.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 sales s on c.id = s.customerid
WHERE o.status == 'Processing'
GROUP BY
c.id, c.contactnumber, c.location