2010-02-20 41 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。