2010-02-20 3 views
5

Я получаю базовую информацию о счете в SQL-запросе и вычисляю итоговые суммы заказа и суммы платежей в том же запросе. Вот что у меня есть до сих пор:Использование нескольких 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 пробела, который будет интерпретироваться сценариями на этом сайте, чтобы обозначить код, и, соответственно, будет переформатирован. –

ответ

18

Если вы запустите запрос без group by, вы увидите, что некоторые платежи имеют несколько строк. Это потому, что вы также присоединяетесь к элементам заказа. Набор результатов будет содержать строку для каждой комбинации orderitem и оплаты.

Одним из решений было бы изменить сумму:

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

Это позволит обеспечить платежи с несколькими ТоварыЗаказа не суммируются несколько раз.

+0

Отличный смысл! Спасибо за быстрый ответ +1! –

+0

Я думаю, что это только что сэкономило мой день –

+0

+1! для объяснения, что вызывает проблему. – mandza

0

Я предполагаю, что оплата составляет 10 долларов США, и в заказе есть два элемента (таблица orderitems). если это так, попробуйте использовать GROUP BY на полях orders/customers/orderstatus.

Смежные вопросы