2010-02-20 34 views
5

我在SQL查询中获取了一些基本的发票信息,并在同一个查询中计算了Order Total和Payment Totals。以下是我迄今:使用多个JOINS。 SUM()产生错误的值

SELECT 
    orders.billerID, 
    orders.invoiceDate, 
    orders.txnID, 
    orders.bName, 
    orders.bStreet1, 
    orders.bStreet2, 
    orders.bCity, 
    orders.bState, 
    orders.bZip, 
    orders.bCountry, 
    orders.sName, 
    orders.sStreet1, 
    orders.sStreet2, 
    orders.sCity, 
    orders.sState, 
    orders.sZip, 
    orders.sCountry, 
    orders.paymentType, 
    orders.invoiceNotes, 
    orders.pFee, 
    orders.shipping, 
    orders.tax, 
    orders.reasonCode, 
    orders.txnType, 
    orders.customerID, 
    customers.firstName AS firstName, 
    customers.lastName AS lastName, 
    customers.businessName AS businessName, 
    orderStatus.statusName AS orderStatus, 
    SUM((orderItems.itemPrice * orderItems.itemQuantity)) 
     + orders.shipping + orders.tax AS orderTotal, 
    SUM(payments.amount) AS totalPayments      <-- this sum 
FROM 
    orders 
    LEFT JOIN customers ON orders.customerID = customers.id 
    LEFT JOIN orderStatus ON orders.orderStatus = orderStatus.id 
    LEFT JOIN payments ON payments.orderID = orders.id   <-- this join 
    LEFT JOIN orderItems ON orderItems.orderID = orders.id 

一切都散发出来的查询奇妙除了totalPayments列。数据库中有一笔付款(10.00)。查询提供的值是20.00(正好是两倍)。我的理论是,出于某种原因,查询是两次“汇总”付款金额列。任何人都可以为我阐明这一点吗?

感谢您的帮助!

+0

嗨,欢迎来到StackOverflow。为了格式化代码,比如SQL,选择它并按下Ctrl + K,这会将块缩进4个空格,这将被本网站上的脚本解释为代码,因此将被相应地重新格式化。 – 2010-02-20 18:18:47

回答

18

如果您在没有group by的情况下运行查询,您会看到一些付款有多行。那是因为你也加入了订单商品。结果集将包含订单项和付款的每个组合的一行。

一种解决方案将是总和更改为:

, <earlier columns>  
, ( select SUM(payments.amount) 
     from payments 
     where payments.orderID = orders.id 
    ) AS totalPayments 
, <later columns> 

这将确保多的OrderItems的支付不累加多次。

+0

非常有意义!感谢您的快速回复+1! – 2010-02-20 18:20:04

+0

我认为这只是拯救了我的一天 – 2013-07-11 21:27:26

+0

+1!以解释造成问题的原因。 – mandza 2014-06-03 15:05:02

0

我的猜测是付款是$ 10,订单中有两项(orderitems表)。如果是这种情况,请尝试在orders/customers/orderstatus字段上使用GROUP BY。