columns - MySQL-SUMs complicados dentro de la consulta
sum count mysql (2)
Esto va a ser difícil de explicar.
Estoy tbl_customers
mis registros de clientes de tbl_customers
varias veces al día.
SELECT c.* FROM tbl_customers c
Estoy devolviendo simplemente el cliente: customerid
, name
, phone
, email
Ahora la parte extraña. Quiero agregar 3 columnas más, después del correo electrónico: totalpaid, totalowed, totalbalance PERO, esos nombres de columna no existen en ningún lado.
Aquí es cómo consulto cada uno: (como una sola consulta)
SELECT SUM(total) AS totalpaid
FROM tbl_customers_bills
WHERE customerid = X
AND billtype = 1
SELECT SUM(total) AS totalowed
FROM tbl_customers_bills
WHERE customerid = X
AND billtype = 2
SELECT SUM(total) AS totalbalance
FROM tbl_customers_bills
WHERE customerid = X
AND billtype IN(1,2)
Entonces, el tipo de billtype
es la columna que me dice si el registro se paga o no.
Estoy perdido aquí. ¿Cómo puedo SUM 3 consultas separadas en el ciclo de la primera consulta?
Puede hacer esto con una combinación de GROUP
, SUM
y IF
SELECT c.id, c.name, c.phone, c.email,
SUM(IF(b.billtype = 1, b.total, 0)) AS totalpaid,
SUM(IF(b.billtype = 2, b.total, 0)) AS totalowed,
SUM(IF(b.billtype = 1 OR b.billtype = 2, b.total, 0)) AS totalbalance,
FROM tbl_customers c LEFT JOIN tbl_customers_bills b ON b.customerid = c.id
GROUP BY c.id
Ver: http://dev.mysql.com/doc/refman/5.0/en//group-by-functions.html http://dev.mysql.com/doc/refman/5.0/en/control-flow- functions.html
Simplemente únase a los clientes a las facturas y haga las sumas. Para separar el total pagado y el total, puede usar SUM(CASE
o SUM(IF
si la respuesta de wless1 demuestra
SELECT c.*,
SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END) totalpaid ,
SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END) totalowed ,
SUM(total) AS totalbalance
FROM
tbl_customers c
LEFT JOIN tbl_customers_bills b
ON c.customerid = b.customerid
and billtype in (1,2)
GROUP BY
c.customerid
Debido a que esto es MySQL, solo necesita agrupar en el PK del cliente.