选择结果在加入时相乘

时间:2017-03-12 08:04:15

标签: sql sql-server

我正在使用一个SQL Server数据库,其中Order表包含一个名为invoice_id的外键,该属性属于Invoice表。此外,我还有一个名为“收据which also includes invoice_id and amount_paid”属性的表格。

许多商品可以分配到同一张发票(客户可以一次订购多个订单),也可以将许多收据分配到同一张发票(客户可以对同一张发票进行不同的付款,例如他们可以支付50%然后再支付其余的费用。)

所以我面临的问题是当我尝试从Receipt表格中选择order_id作为条件的总付费金额时,结果将根据订单数量相乘具有相同的invoice_id

例如,客户A一次下了三个订单,每个订单成本为100美元,发票中应该是300美元,他已经支付了该发票。现在如果我查询Receipt表中的付款金额,结果将是900美元(300美元* 3个订单),这显然是不正确的。

我坚持这个问题,我相信我的数据库逻辑有一些错误,所以请提供你的建议来解决这个问题,以及如果逻辑不正确,应该如何处理数据库。

以下是我用于获取结果的查询:

select sum(r.amount_paid), o.invoice_id from RECEIPT r, INVOICE i, ORDER o
where r.invoice_id = i.invoice_id
and o.invoice_id = i.invoice_id
group by o.invoice_id;

2 个答案:

答案 0 :(得分:1)

这里有三个答案,可能会对您的数据库提出三个略有不同的问题。

每张发票支付的金额

如果您想获得每张发票支付的总金额,您只需要

SELECT   SUM(Amount_Paid) Total_Paid, 
         Invoice_ID
FROM     Receipt
GROUP BY Invoice_ID

每笔订单支付的金额

如果您想知道每个订单的总付费,那么您的数据模型中就不太可能如您所描述的那样。如果发票上有三个订单,并且发票只是部分支付,则无法确定哪些订单已付款,哪些订单未付款。

您需要一些额外的数据结构,指明付款如何应用于发票中的订单,例如分配或拆分表。

与一个或多个订单相关的发票上支付的金额

另一方面,如果您想知道在包含一个或多个订单ID的发票上收到了多少付款,您可以写下:

SELECT   SUM(Amount_Paid) Total_Paid, 
         Invoice_ID
FROM     Receipt
WHERE    Invoice_ID IN (SELECT Invoice_ID 
                        FROM   Order 
                        WHERE  Order_ID IN (1,2,3,4))  --Edit these IDs for your specific case
GROUP BY Invoice_ID

请注意,上述查询都不需要任何连接,因此没有乘法:)

答案 1 :(得分:0)

请试试这个:

SELECT SUM(r.amount_paid), r.invoice_id FROM RECEIPT r
JOIN INVOICE i ON r.invoice_id = i.invoice_id
JOIN ORDER o ON r.invoice_id = o.invoice_id  AND r.order_id = o.order_Id
GROUP BY r.invoice_id;