MySQL - Сложные суммы внутри запроса
Это будет сложно объяснить.
Я перебираю записи своих клиентов из tbl_customers
несколько раз в день.
SELECT c.* FROM tbl_customers c
Я возвращаю просто заказчику: customerid
, name
, phone
, email
Теперь странная часть. Я хочу добавить еще 3 столбца после электронной почты: totalpaid, totalowed, totalbalance, НО, эти имена столбцов нигде не существуют.
Вот как я запрашиваю каждый: (как один запрос)
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)
Итак billtype
это столбец, который сообщает мне, оплачивается ли запись или нет.
Я в недоумении здесь. Как можно суммировать 3 отдельных запроса в цикле первого запроса?
2 ответа
Просто присоединяйте клиентов к счетам и делайте суммы. Вы можете использовать Totalpaid и Totalowed вы можете использовать SUM(CASE
или же SUM(IF
как показывает ответ wless1
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
Потому что это MySQL, вам нужно только сгруппировать на ПК клиента.
Вы можете сделать это с помощью комбинации GROUP
, SUM
, а также 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
См.: http://dev.mysql.com/doc/refman/5.0/en//group-by-functions.html http://dev.mysql.com/doc/refman/5.0/ru/control-flow-functions.html