我正在使用一个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;
答案 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;