如何在不同条件下使用多重选择获得结果

时间:2019-10-22 15:44:10

标签: sql sqlite

我有四个表的客户,订单,订单项和销售,我想获取每个客户的应付总额以及每个客户的余额。为此,我尝试了以下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 

它生成以下输出:

Output

它正确地计算了应付金额,但是它计算了两次余额,因为两个客户的原始余额均为100,但是每个余额都显示为200。

还请注意,订单有一个状态列,如果订单金额到期,该列将显示“正在处理”,如果余额尚余,则将显示“未完成”。

表结构为:

订单:

Orders

销售:

Sales

OrderItems:

OrderItems

客户:

Customers

请帮助。

2 个答案:

答案 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