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

Другие вопросы по тегам