2015-02-20 2 views
0

У меня есть следующие таблицы, я хочу получить Purchase_order и его order_quantity и сумму полученного количества для каждой покупки. я знаю, как суммировать количество из одной таблицы, а из нескольких таблиц, это сбивает с толком меня много ...суммировать количество из 3-й реляционной таблицы

mysql> select * from purchase_order; 
+-------------------+-------------------------+-------+---------------------+ 
| purchase_order_id | purchase_order   | cost | created_on   | 
+-------------------+-------------------------+-------+---------------------+ 
|     1 | Dell Computer 000001256 | 10000 | 2015-02-19 22:14:52 | 
|     2 | HP Computer 000001256 | 50000 | 2015-02-19 22:14:52 | 
+-------------------+-------------------------+-------+---------------------+ 
2 rows in set (0.00 sec) 

mysql> select * from purchase_order_detail; 
+--------------------------+-------------------+---------+------------------+ 
| purchase_order_detail_id | purchase_order_id | item_id | ordered_quantity | 
+--------------------------+-------------------+---------+------------------+ 
|      1 |     1 |  279 |    100 | 
|      2 |     1 |  286 |    100 | 
|      3 |     2 |  279 |    200 | 
|      4 |     2 |  286 |    300 | 
+--------------------------+-------------------+---------+------------------+ 
4 rows in set (0.00 sec) 

mysql> select * from delivery_order; 
+-------------------+--------------------------+-------------------+---------------------+ 
| delivery_order_id | purchase_order_detail_id | recieved_quantity | recieved_on   | 
+-------------------+--------------------------+-------------------+---------------------+ 
|     1 |      1 |    50 | 2015-02-19 22:22:51 | 
|     2 |      2 |    50 | 2015-02-19 22:24:59 | 
|     3 |      1 |    50 | 2015-02-19 22:34:14 | 
|     4 |      3 |    70 | 2015-02-20 11:11:31 | 
|     5 |      4 |    150 | 2015-02-20 11:11:31 | 
|     6 |      3 |    90 | 2015-02-20 11:12:20 | 
|     7 |      4 |    100 | 2015-02-20 11:12:20 | 
|     8 |      3 |    40 | 2015-02-20 11:12:55 | 
|     9 |      4 |    50 | 2015-02-20 11:12:55 | 
+-------------------+--------------------------+-------------------+---------------------+ 

До сих пор, у меня есть этот запрос, но идентификатор не возвращает правильную записи ..

SELECT po.purchase_order_id, SUM(pod.ordered_quantity) AS Sum_of_ordered_quantity, SUM(dor.recieved_quantity) AS Sum_of_recieved_quantity 
FROM purchase_order AS po 
    INNER JOIN purchase_order_detail AS pod ON po.purchase_order_id = pod.purchase_order_id 
    INNER JOIN delivery_order AS dor ON dor.purchase_order_detail_id = pod.purchase_order_detail_id 
GROUP BY po.purchase_order_id 

возвращает это,

+-------------------+-------------------------+--------------------------+ 
| purchase_order_id | Sum_of_ordered_quantity | Sum_of_received_quantity | 
+-------------------+-------------------------+--------------------------+ 
|   1   |   300   |   150    | 
|   2   |   1500   |   500    | 
+-------------------+-------------------------+--------------------------+ 

вы можете увидеть в этом вопросе, что purchase_order_id 1 имеет 200 заказанное количество и 150 получили количество в то время как purchase_order_id 2 имеет 500 ordered_quantity и 500 полученное количество.

+0

Вы пробовали с помощью 'JOIN'.Show кода. –

+0

см. Обновление –

ответ

2

Пожалуйста, попробуйте этот код:

SELECT po.purchase_order_id, 

    SUM(pod.ordered_quantity) AS Sum_of_ordered_quantity, 

    (SELECT `mySelect`.`desired_sum` FROM 
         (SELECT B.`purchase_order_id` AS myID, SUM( `A`.`recieved_quantity`) AS desired_sum 
         FROM `delivery_order` AS A 
         LEFT JOIN `purchase_order_detail` AS B ON A.purchase_order_detail_id = B.purchase_order_detail_id 
         GROUP BY B.`purchase_order_id`) AS mySelect 
         WHERE `mySelect`.`myID` = `po`.`purchase_order_id`) AS Sum_of_received_quantity 
    FROM purchase_order AS po 
    INNER JOIN purchase_order_detail AS pod ON po.purchase_order_id = pod.purchase_order_id 
    GROUP BY po.purchase_order_id 
+0

ERROR 1064 (42000): У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'received_quantity FROM purchase_order AS po INNER JOIN purchase_order_detail' в строке 1 –

+0

@MTaqi Я обновил и протестировал новый код. Он работает и дает хорошие результаты. Попробуйте. – besciualex

2

Это обычно при этом агрегатной функции суммы с несколькими много-ко-многим таблиц с различным условием объединения. Один из способов - использовать коррелированный подзапрос, чтобы получить агрегированное значение, а затем выполнить соединение. Что-то, как

select 
po.purchase_order_id, 
pod.Sum_of_ordered_quantity, 
do.Sum_of_received_quantity 
from purchase_order po 
join 
(
    select purchase_order_id,sum(ordered_quantity) as Sum_of_ordered_quantity 
    from purchase_order_detail 
    group by purchase_order_id 
)pod on pod.purchase_order_id = po.purchase_order_id 
join 
(
    select 
    t1.purchase_order_id, 
    sum(t2.recieved_quantity) as Sum_of_received_quantity 
    from purchase_order_detail t1 
    join delivery_order t2 on t1.purchase_order_detail_id = t2.purchase_order_detail_id 
    group by t1.purchase_order_id 
)do on do.purchase_order_id = po.purchase_order_id 

DEMO

Смежные вопросы