2016-02-16 2 views
1

Категория ТаблицаSql сумма() столбцов из разных таблиц

mysql> SELECT * FROM cats; 
+------+------+-----------+ 
| c_id | p_id | c_name | 
+------+------+-----------+ 
| 1 | 1 | cats 1 | 
| 2 | 1 | cats 2 | 
| 3 | 1 | cats 3 | 
+------+------+-----------+ 

Meta Таблица

mysql> SELECT * FROM meta; 
+------+------+------+---------+-------------+-------+ 
| m_id | p_id | c_id | name | description | costs | 
+------+------+------+---------+-------------+-------+ 
| 1 | 1 | 1 | Abhijit | description | 100 | 
| 2 | 1 | 1 | Abhijit | description | 200 | 
| 3 | 1 | 2 | Abhiji2 | description | 500 | 
+------+------+------+---------+-------------+-------+ 

Transaction Таблица

mysql> SELECT * FROM transactions; 
+------+------+------+---------------------+--------+ 
| t_id | p_id | m_id | date    | amount | 
+------+------+------+---------------------+--------+ 
| 1 | 1 | 1 | 2016-02-16 11:17:06 | 50  | 
| 2 | 1 | 1 | 2016-02-16 11:17:06 | 50  | 
| 3 | 1 | 2 | 2016-02-16 11:17:06 | 50  | 
| 4 | 1 | 2 | 2016-02-16 11:17:06 | 150 | 
+------+------+------+---------------------+--------+ 

Я хочу подвести() для каждого из расходов категории (от мета-таблица) и количество (из таблицы транзакций).

Я использую:

mysql> SELECT c.*, SUM(t.amount), SUM(m.costs) 
    FROM cats c 
     LEFT JOIN meta m ON m.c_id=c.c_id 
     LEFT JOIN transactions t ON t.m_id=m.m_id 
    GROUP BY c.c_id; 

+------+------+-----------+--------+---------------+--------------+ 
| c_id | p_id | c_name | add_by | SUM(t.amount) | SUM(m.costs) | 
+------+------+-----------+--------+---------------+--------------+ 
| 1 | 1 | Abhijit |  1 |   100 |   400 | 
| 2 | 1 | Abhiji2 |  1 |   200 |   500 | 
+------+------+-----------+--------+---------------+--------------+ 

Это неправильно. Расходы, связанные с кошками ID является , но здесь я получил

Я хочу получить возвращения из запроса, как это:.

+------+------+-----------+--------+---------------+--------------+ 
| c_id | p_id | c_name | add_by | SUM(t.amount) | SUM(m.costs) | 
+------+------+-----------+--------+---------------+--------------+ 
| 1 | 1 | Abhijit |  1 |   100 |   300 | 
| 2 | 1 | Abhiji2 |  1 |   200 |   500 | 
+------+------+-----------+--------+---------------+--------------+ 
+0

выполнить запрос без суммам и GROUP, чтобы увидеть, что случилось –

+0

Вы выбора из 'con_cats' в вашем SUM запрос, но вы выберите из 'cats' в своем первом запросе. –

+0

Нет Нет Нет, просто набрав плохое обращение. имя таблицы - это кошки – ABHIJIT

ответ

2

Я думаю, что у вас была опечатка (или ошибки) в одном из ваших JOIN условий. Я думаю, что вы хотели ваш первоначальный запрос, чтобы быть в этом:

SELECT c.*, SUM(t.amount), SUM(m.costs) 
FROM cats c 
    LEFT JOIN meta m ON m.c_id = c.c_id 
    LEFT JOIN transactions t ON t.m_id = m.c_id 
GROUP BY c.c_id; 

Примечание тщательно ON t.m_id = m.c_id, что согласуется с ожидаемым выходом. В любом случае, я переработал свой запрос следующим образом:

SELECT c.c_id, c.p_id, c.c_name, t2.transactionCosts, t1.metaCosts 
FROM cats c 
LEFT JOIN 
(
    SELECT c_id, SUM(costs) AS metaCosts 
    FROM meta 
    GROUP BY c_id 
) t1 
    ON c.c_id = t1.c_id 
LEFT JOIN 
(
    SELECT m_id, SUM(amount) AS transactionCosts 
    FROM transactions 
    GROUP BY m_id 
) t2 
    ON c.c_id = t2.m_id 
WHERE t2.transactionCosts IS NOT NULL OR t1.metaCosts IS NOT NULL; 

Первый подзапрос вычисляет мету итога для каждого c_id, а второй подзапрос вычисляет общее количество транзакций для каждого m_id. Эти результаты затем объединяются вместе с таблицей cats, чтобы получить окончательный результат.

Перейдите по ссылке ниже для запущенной демки:

SQLFiddle

+0

Это действительно хорошо. THANKS – ABHIJIT

+0

ПОЖАЛУЙСТА, можете ли вы объяснить этот вопрос для меня, чтобы лучше понять его. – ABHIJIT

+0

или использовать полную ссылку для этого. ПОЖАЛУЙСТА, – ABHIJIT

0

проблема есть вы выбираете с *, но только группа c_id, в этом случае у вас есть 2 варианта. оконной функции или подзапроса.

через более (раздел по):

SELECT c.*, 
     SUM(t.amount)over(partition by c.c_id) as amount, 
     SUM(m.costs)over(partition by c.c_id) as cost 
FROM con_cats c 
    LEFT JOIN meta m ON m.c_id=c.c_id 
    LEFT JOIN transactions t ON t.m_id=m.m_id; 

с помощью подзапроса:

select a.*,b.amount,b.costs from con_cats a 
inner join 
(SELECT c.c_id, SUM(t.amount) as amount, SUM(m.costs) as costs 
FROM con_cats c 
    LEFT JOIN meta m ON m.c_id=c.c_id 
    LEFT JOIN transactions t ON t.m_id=m.m_id 
GROUP BY c.c_id) b 
on a.c_id = b.c_id; 
+0

Он использует MySQL, поэтому я не верю, что у него будут функции окна. –

+0

Это не работает. – ABHIJIT

+0

@ABHIJIT вы пробовали оба? я не заметил mysql, поэтому функция окна пойдет не так, но в подзапрос должен работать –