2015-02-24 6 views
1

я следующие схемы, purchase_orderзапрос, чтобы получить данные из четырех таблиц

+-------------------+----------------------+ 
| purchase_order_id | purchase_order  | 
+-------------------+----------------------+ 
|    54 | Purchase Order 12345 | 
|    56 | po-laptop-hp-3  | 
|    57 | po-laptop-hp-1  | 
+-------------------+----------------------+ 

purchase_order_detail

+--------------------------+-------------------+---------+------------------+ 
| purchase_order_detail_id | purchase_order_id | item_id | ordered_quantity | 
+--------------------------+-------------------+---------+------------------+ 
|      61 |    54 |  279 |    500 | 
|      62 |    54 |  286 |    700 | 
|      63 |    56 |  279 |    43 | 
|      64 |    57 |  279 |    43 | 
|      65 |    57 |  286 |    43 | 
|      66 |    57 |  287 |    43 | 
+--------------------------+-------------------+---------+------------------+ 

delivery_order

+-------------------+--------------------------+-------------------+ 
| delivery_order_id | purchase_order_detail_id | recieved_quantity | 
+-------------------+--------------------------+-------------------+ 
|    62 |      61 |    250 | 
|    63 |      62 |    300 | 
|    64 |      63 |    34 | 
|    65 |      64 |    34 | 
|    66 |      65 |    34 | 
|    67 |      66 |    34 | 
|    68 |      61 |    34 | 
|    69 |      61 |    34 | 
+-------------------+--------------------------+-------------------+ 

запас

+----------+-------------------+------------+----------+------------------+---------------+ 
| stock_id | delivery_order_id | project_id | quantity | initial_quantity | stock_type_id | 
+----------+-------------------+------------+----------+------------------+---------------+ 
|  12 |    62 |   1 |  60 |    60 |    1 | 
|  13 |    63 |   1 |  120 |    120 |    1 | 
|  14 |    63 |   1 |  50 |    50 |    1 | 
|  15 |    64 |   1 |  12 |    12 |    1 | 
|  16 |    62 |   1 |  120 |    120 |    1 | 
|  17 |    62 |   1 |  12 |    12 |    1 | 
+----------+-------------------+------------+----------+------------------+---------------+ 

я должен написать этот запрос, но он возвращает повторяющиеся результаты

 SELECT po.created_on 
      , po.purchase_order 
      , i.item_name 
      , u.unit_name 
      , pod.ordered_quantity 
      , do.recieved_quantity 
      , do.recieved_on 
      , po.remarks 
     FROM purchase_order  po 
      , purchase_order_detail pod 
      , delivery_order  do 
      , stock     s 
      , item     i 
      , unit     u 
     WHERE u.unit_id     = i.unit_id 
     AND i.item_id     = pod.item_id 
     AND po.purchase_order_id   = pod.purchase_order_id 
     AND pod.purchase_order_detail_id = do.purchase_order_detail_id 
     AND do.delivery_order_id   = s.delivery_order_id 
     AND s.project_id     = 1 
    ORDER BY po.purchase_order_id 
      , pod.item_id 
      ; 

В результаты

+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+ 
| created_on   | purchase_order  | item_name | unit_name | ordered_quantity | recieved_quantity | recieved_on   | remarks        | 
+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+ 
| 2015-02-24 22:48:15 | Purchase Order 12345 | HP Laptops | Unit  |    500 |    250 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test | 
| 2015-02-24 22:48:15 | Purchase Order 12345 | HP Laptops | Unit  |    500 |    250 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test | 
| 2015-02-24 22:48:15 | Purchase Order 12345 | Lenovo  | Unit  |    700 |    300 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test | 
| 2015-02-24 22:48:15 | Purchase Order 12345 | Lenovo  | Unit  |    700 |    300 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test | 
| 2015-02-24 22:55:40 | po-laptop-hp-3  | HP Laptops | Unit  |    43 |    34 | 2015-02-21 00:00:00 | dfgsdfgsd        | 
+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+ 

отношения один ко многим, сверху донизу. То, что я хотел получить, - это каждый заказ на покупку, его упорядоченное количество каждого элемента и общее количество и количество на складе, где project_id = 1 со склада.

я ожидал что-то вроде этого,

+-------------------+---------+------------------+---------------+----------+ 
| purchase_order_id | item_id | ordered_quantity | totalReceived | quantity | 
+-------------------+---------+------------------+---------------+----------+ 
|    54 |  279 |    500 |   314 |  192 | 
|    54 |  286 |    700 |   300 |  170 | 
|    56 |  279 |    43 |   34 |  12 | 
+-------------------+---------+------------------+---------------+----------+ 
+0

Каковы ваши ожидаемые результаты из данных образца? – AdamMc331

ответ

2

EDIT

Спасибо за прояснение ошибку в своей первой части. Теперь я понимаю, что мы не можем делать все вычисления в одном запросе (потому что мы группируем разные столбцы в разных частях), поэтому я начал писать отдельные подзапросы и объединять их вместе. Шаги пошел что-то вроде этого:

  • Получить сумму полученного общего полученного количества для каждого purchase_order_detail_id из таблицы delivery_order.
  • Соедините этот подзапрос с самой таблицей delivery_order, чтобы получить totalReceived для различных значений delivery_order_id.
  • Присоедините этот набор результатов с помощью таблицы purchase_order_detail, чтобы получить buy_order_id, item_id и order_quantity для каждого delivery_order_id.

Теперь у нас есть результирующий набор, включающий delivery_order_id, purchase_order_id, item_id, order_quantity и общее количество полученных. Последние две вещи:

  • Получить сумму SUM() для каждой доставки_order_id из таблицы запаса.
  • Присоединиться к нашему приведенному выше результату при условии, что order_id соответствует (так что мы получим только одну строку), а project_id равно 1 (поэтому мы получаем только необходимые значения delivery_order_id). Я положил это условие в предложение WHERE подзапроса sum.

Вот ваш окончательный запрос:

SELECT tmp1.purchase_order_id, tmp1.item_id, tmp1.ordered_quantity, tmp1.totalReceived, tmp2.quantity 
FROM(
    SELECT tmp.delivery_order_id, pod.purchase_order_id, pod.item_id, pod.ordered_quantity, tmp.totalReceived 
    FROM purchase_order_detail pod 
    JOIN(
    SELECT do.delivery_order_id, tmp.purchase_order_detail_id, tmp.totalReceived 
    FROM delivery_order do 
    JOIN(
     SELECT do.purchase_order_detail_id, SUM(do.received_quantity) AS totalReceived 
     FROM delivery_order do 
     GROUP BY do.purchase_order_detail_id) tmp ON tmp.purchase_order_detail_id = do.purchase_order_detail_id) 
    tmp ON tmp.purchase_order_detail_id = pod.purchase_order_detail_id) tmp1 
JOIN(
    SELECT s.delivery_order_id, SUM(quantity) AS quantity 
    FROM stock s 
    WHERE s.project_id = 1 
    GROUP BY s.delivery_order_id) tmp2 ON tmp2.delivery_order_id = tmp1.delivery_order_id; 

Вот SQL Fiddle. Он также показывает все промежуточные шаги, если вы хотите увидеть, как результаты собрались вместе.

+0

ваш запрос довольно близко, но он возвращает результат гребли, запустив это, чтобы посмотреть на разницу упорядоченного и получаемого квантования. –

+0

Хмм, я постараюсь разобраться. Можете ли вы изменить свой вопрос с правильными результатами, которые я должен получить? – AdamMc331

+0

проблема с вашим запросом заключается в том, что их много получено_quantity против одного упорядоченного_quantity, тогда он возвращает неверный результат, иначе правильный. и то же самое произошло с моим запросом. –

0

Попробуйте изменить запрос, чтобы использовать DISTINCT и OUTER JOIN и вместо декартовой («запятая») присоединяется.

SELECT DISTINCT po.created_on 
     , po.purchase_order 
     , i.item_name 
     , u.unit_name 
     , pod.ordered_quantity 
     , do.recieved_quantity 
     , do.recieved_on 
     , po.remarks 
    FROM purchase_order po 
    LEFT JOIN purchase_order_detail pod USING (purchase_order_id) 
    LEFT JOIN delivery_order do USING (purchase_order_detail_id) 
    LEFT JOIN stock s USING (delivery_order_id) 
    LEFT JOIN item i USING (item_id) 
    LEFT JOIN unit u USING (unit_id) 
ORDER BY po.purchase_order_id 
     , pod.item_id 
     ;