2010-02-20 21 views
5

मुझे SQL क्वेरी में कुछ बुनियादी चालान जानकारी मिल रही है और उसी क्वेरी में ऑर्डर कुल और भुगतान टोटल ढूंढ रही है। यहां मेरे पास अब तक है:एकाधिक जॉइन का उपयोग करना। 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 

कुल भुगतान कॉलम को छोड़कर सब कुछ आश्चर्यजनक रूप से क्वेरी से बाहर आता है। (10.00) के मूल्य के साथ डेटाबेस में एक भुगतान है। क्वेरी द्वारा प्रदान किया गया मान 20.00 (बिल्कुल डबल) है। मेरा सिद्धांत यह है कि, किसी कारण से, क्वेरी दो बार भुगतान राशि कॉलम "संक्षेप में" होती है। क्या कोई मेरे लिए इस पर कुछ प्रकाश डाल सकता है?

सहायता के लिए धन्यवाद!

+0

हाय, और स्टैक ओवरव्लो में आपका स्वागत है। एसक्यूएल की तरह कोड को प्रारूपित करने के लिए, इसे चुनें और Ctrl + K दबाएं, यह ब्लॉक को 4 रिक्त स्थान से इंडेंट करेगा, जिसे इस साइट पर स्क्रिप्ट द्वारा कोड का अर्थ दिया जाएगा, और इस प्रकार तदनुसार सुधार किया जाएगा। –

उत्तर

18

यदि आप group by के बिना क्वेरी चलाते हैं, तो आप देखेंगे कि कुछ भुगतानों में एकाधिक पंक्तियां हैं। ऐसा इसलिए है क्योंकि आप ऑर्डर आइटम पर भी शामिल हो रहे हैं। परिणाम सेट में ऑर्डरिटम और भुगतान के प्रत्येक संयोजन के लिए एक पंक्ति होगी।

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

इससे यह सुनिश्चित होगा कई orderitems साथ भुगतान कई बार अभिव्यक्त नहीं कर रहे हैं:

एक समाधान करने के लिए योग को बदलने के लिए किया जाएगा।

+0

महान समझ में आता है! त्वरित उत्तर +1 के लिए धन्यवाद! –

+0

मुझे लगता है कि यह सिर्फ मेरे दिन –

+0

+1 बचाया! स्पष्टीकरण के लिए समस्या का कारण क्या है। – mandza

0

मेरा अनुमान है कि भुगतान $ 10 है और ऑर्डर (ऑर्डरिटम्स टेबल) में दो आइटम हैं। यदि ऐसा है, तो ऑर्डर/ग्राहक/ऑर्डरस्टैटस फ़ील्ड पर ग्रुप बाय का उपयोग करने का प्रयास करें।

संबंधित मुद्दे