2010-02-20 16 views
5

Obtengo información de factura básica en una consulta SQL y calculo el total del pedido y los totales de pago en la misma consulta. Esto es lo que tengo hasta ahora:Usar uniones múltiples. SUM() produciendo el valor incorrecto

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 

Todo sale de la consulta maravillosamente, excepto la columna de TotalPayments. Hay un pago en la base de datos con el valor de (10.00). El valor proporcionado por la consulta es 20.00 (exactamente el doble). Mi teoría es que, por alguna razón, la consulta está "sumando" dos veces la columna de importe de pago. ¿Alguien puede arrojar algo de luz sobre esto para mí?

¡Gracias por la ayuda!

+0

Hola y bienvenidos a StackOverflow. Para formatear el código, como SQL, selecciónelo y pulse Ctrl + K, esto sangrará el bloque en 4 espacios, que serán interpretados por los scripts en este sitio para que signifiquen un código y, por lo tanto, se formateará en consecuencia. –

Respuesta

18

Si ejecuta la consulta sin un group by, verá que algunos pagos tienen varias filas. Esto se debe a que también se está uniendo a artículos de pedido. El conjunto de resultados contendrá una fila para cada combinación de orderitem y pago.

Una solución sería cambiar la suma de:

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

Esto garantizaría los pagos con múltiples artículos de pedido no se suman varias veces.

+0

¡Tiene mucho sentido! Gracias por la rápida respuesta +1! –

+0

Creo que esto acaba de salvar mi día –

+0

+1! para explicar qué está causando el problema. – mandza

0

Supongo que el pago es de $ 10 y hay dos elementos en el pedido (tabla de artículos de pedido). si ese es el caso, intente usar un GROUP BY en los campos orders/customers/orderstatus.

Cuestiones relacionadas