Как выбрать mysql SUM из нескольких таблиц и других столбцов из другой таблицы?

#php #mysql #sum

#php #mysql #сумма

Вопрос:

У меня есть три таблицы: наличные, чек и счет. Все три таблицы имеют два общих столбца: billId и CustomerID.

Таблица счетов

  -------- ------------ --------- ------------ 
| billId | date       | bAmount | customerId |
 -------- ------------ --------- ------------ 
| #1     | 01-05-2016 | 120.00  | 2          |
 -------- ------------ --------- ------------ 
| #2     | 10-05-2016 | 100.00  | 2          |
 -------- ------------ --------- ------------ 
| #3     | 20-05-2016 | 80.00   | 2          |
 -------- ------------ --------- ------------ 
| #4     | 20-05-2016 | 70.00   | 2          |
 -------- ------------ --------- ------------ 
| #5     | 27-05-2016 | 50.00   | 2          |
 -------- ------------ --------- ------------ 
| #6     | 28-05-2016 | 20.00   | 2          |
 -------- ------------ --------- ------------ 
  

Контрольная таблица

  ---------- -------- ------------ ---------- 
| chequeId | billId | customerId | chAmount |
 ---------- -------- ------------ ---------- 
| 1        | #1     | 2          | 50.00    |
 ---------- -------- ------------ ---------- 
| 2        | #2     | 2          | 25.00    |
 ---------- -------- ------------ ---------- 
| 3        | #5     | 2          | 36.00    |
 ---------- -------- ------------ ---------- 
| 4        | #4     | 2          | 23.00    |
 ---------- -------- ------------ ---------- 
  

Таблица наличных

  -------- -------- ------------ ---------- 
| cashId | billId | customerId | caAmount |
 -------- -------- ------------ ---------- 
| 1      | #1     | 2          | 55.00    |
 -------- -------- ------------ ---------- 
| 2      | #2     | 2          | 70.00    |
 -------- -------- ------------ ---------- 
| 3      | #3     | 2          | 69.00    |
 -------- -------- ------------ ---------- 
| 4      | #4     | 2          | 23.00    |
 -------- -------- ------------ ---------- 
  

Я должен сгенерировать запрос для получения результатов, подобных приведенным ниже:

  -------- ------------ -------- --------- 
| billId | date       | amount | pending |
 -------- ------------ -------- --------- 
| #1     | 01-05-2016 | 120.00 | 15.00   |
 -------- ------------ -------- --------- 
| #2     | 10-05-2016 | 100.00 | 05.00   |
 -------- ------------ -------- --------- 
| #3     | 20-05-2016 | 80.00  | 11.00   |
 -------- ------------ -------- --------- 
| #4     | 20-05-2016 | 70.00  | 14.00   |
 -------- ------------ -------- --------- 
| #5     | 27-05-2016 | 50.00  | 04.00   |
 -------- ------------ -------- --------- 
  

Я отправляю значение для CustomerID на эту страницу с другой страницы, например, $customerId = $_REQUEST['customerId'] и из этого я должен выбрать BillId и Date из таблицы счетов, сумму (которая вычисляется по сумме chAmount caAmount ) и ожидание (которое вычисляется по разнице bAmount-(chAmount caAmount) ). Поскольку в billId # 6 нет записей в таблицах check и cash, его не нужно указывать в результатах. Пожалуйста, укажите правильный запрос MySQL и объясните его.

Ответ №1:

Обычно вы должны что-то попробовать, но, поскольку я нахожусь в «хороших днях», я написал полный оператор SQL :

 SELECT b.billId, b.bDate, b.bAmount, SUM(ch.chAmount) chAmountSum, SUM(ca.caAmount) caAmountSum, (b.bAmount - ( IFNULL(SUM(ch.chAmount), 0)    IFNULL(SUM(ca.caAmount), 0))) pending
FROM bill b
LEFT JOIN  cheque ch on ch.billId = b.billId
LEFT JOIN  cash ca on ca.billID = b.billId
GROUP BY b.billID;
  
  • Вы должны выбрать все столбцы, которые вы хотите отобразить
  • Для последнего (ожидающего) выполните свою операцию (сумма — (чек наличные)), и если это нулевое значение, замените его на «0» благодаря функции IFNULL SQL
  • Используйте ЛЕВОЕ соединение, потому что вам нужны все счета, даже если еще нет соответствующего платежа (чек / наличные)
  • ГРУППИРУЙТЕ ПО вашему справочному столбцу: billID

Комментарии:

1. Я пытался сделать это около 4 часов, и, наконец, вы дали мне замечательное решение, большое спасибо. и где вы изучали SQL? 😉

2. мне также нужно WHERE=’CustomerID’?

3. Я выучил это в школе, и мне это понравилось 😉 ! Да, если вы хотите фильтровать по конкретному клиенту, просто добавьте WHERE предложение. Но вам это не нужно, если вы хотите получить глобальный результат (для всех ваших клиентов), потому что таблицы уже связаны уникальным идентификатором счета, а счет связан только с одним клиентом.