SQL Join会导致多次添加

时间:2016-10-31 20:35:20

标签: sql sql-server

我确定之前已经问过这个问题,所以如果有的话,请帮助引导我朝正确的方向前进,但我的问题是这个。

我有一个SQL查询,可以从2个表中收集销售数据 - CustomerInvoiceCustomerInvoiceDetail

CustomerInvoice包含有关发票的通用数据,例如客户名称,地址等,但也包含运费金额。

示例表数据(每个发票代码一条记录):

╔══════════════╦═══════════════╦════════════════════════════╦═════════╗
║ Invoice Code ║ Customer Name ║ Address                    ║ Freight ║
╠══════════════╬═══════════════╬════════════════════════════╬═════════╣
║ INV-200000   ║ ABC Co        ║ 1 Apple Street, FRUITVILLE ║ 20      ║
╚══════════════╩═══════════════╩════════════════════════════╩═════════╝

CustomerInvoiceDetail包含发票中每个订单项的信息。通常,一张发票上有多个订单项。

示例表数据(每个发票代码多个记录)

╔══════════════╦═════════════╦══════════╦═══════╦══════════╗
║ Invoice Code ║ Part Number ║ Quantity ║ Price ║ ExtPrice ║
╠══════════════╬═════════════╬══════════╬═══════╬══════════╣
║ INV-20000    ║ 50505       ║ 2        ║ 5     ║ 10       ║
╠══════════════╬═════════════╬══════════╬═══════╬══════════╣
║ INV-20000    ║ 51325       ║ 3        ║ 2     ║ 6        ║
╚══════════════╩═════════════╩══════════╩═══════╩══════════╝

这意味着我的JOIN会产生CustomerInvoice表的多个结果,在示例中,运费为40美元:2个订单项x $ 20运费。

我的查询如下,将运费金额(表CustomerInvoice)乘以订单项的数量(在表CustomerInvoiceDetail上)

我目前得到的是销售价格+(运费* CustomerInvoiceDetail上的订单项数量)

我需要的是销售价格+一个运费实例(样本情况下,10 + 6 + 20)

SELECT 
  SUM(cid.ExtPrice + ci.Freight ) AS 'Sales'
FROM CustomerInvoice ci
JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode

如果有人有任何建议或资源可以指导我研究这个,我将非常感激!再次感谢。

2 个答案:

答案 0 :(得分:0)

您需要在之前汇总

SELECT (cid.ExtPrice + ci.Freight ) AS Sales
FROM (SELECT SUM(ci.Freight) as Freight
      FROM CustomerInvoice ci
     ) ci CROSS JOIN
     (SELECT SUM(cid.ExtPrice) as ExtPrice
      FROM CustomerInvoiceDetail cid
     ) cid;

由于JOIN,您为每张发票增加了Freight的行数。

答案 1 :(得分:0)

我相信你可以通过这样的方式来避免子查询:

╔══════════════╦═════════════╗
║ Invoice Code ║ Sales       ║
╠══════════════╬═════════════╣
║ INV-20000    ║ 36          ║
╠══════════════╬═════════════╣
║ INV-20001    ║ 100         ║
╠══════════════╬═════════════╣
║ INV-20002    ║ 50          ║
╚══════════════╩═════════════╝

示例输出:

WHERE InvoiceCode='INV-20000'

如果需要,您可以添加<%= if @user.microposts.any? %> 以仅选择一张发票。