SQL Запрос по таблицам - PullRequest
       8

SQL Запрос по таблицам

0 голосов
/ 05 марта 2020

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

Составлены таблица заказов и таблицы обработки;

Orders
Ref         | Fruit     | Shapes        | Colours   | OrderDate
-----------------------------------------------------------------
22222       | Apple     | Round         | Red       | 2020/02/23
33333       | Pear      | Round         | Green     | 2020/02/23
44444       | Banana    | Long          | Yellow    | 2020/02/23

Processing
Fruit       | ProcessID     | ProcessDateTime
-----------------------------------------+----------------------------
Apple       | Receipt       | 2020/02/23 09:34:03
Apple       | Repack        | 2020/02/23 10:15:23
Apple       | Dispatch      | 2020/02/23 10:32:11
Pear        | Receipt       | 2020/03/23 08:34:55
Pear        | Repack        | 2020/02/23 09:08:43
Pear        | Dispatch      | 2020/02/23 10:43:21
Banana      | Receipt       | 2020/02/23 07:23:32
Banana      | Repack        | 2020/02/23 09:33:28
Banana      | Dispatch      | 2020/02/23 11:38:01

И извлеченные данные должны быть похожи на формат;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   | 2020/02/23 10:15:23   | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   | 2020/02/23 09:08:43   | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   | 2020/02/23 09:33:28   | 2020/02/23 11:38:01

Код, который я создал, будет начинаться аналогично to;

SELECT
Orders.Ref,
Orders.Fruit,
Orders.Shapes,
Orders.Colours,
.Now I want to select each ProcessID for each Ref and ProcessDateTime date for each of the processes in Processing. 
There are 3 processes in the example here, but it will not necesarily always
be 3, it will vary in number of processes.

FROM Orders
LEFT INNER JOIN Processing ON Processing.Fruit = Orders.Fruit

WHERE
Orders.OrderDate BETWEEN date1 AND date2;  -- These dates will be identified when running...

Я просмотрел онлайн информацию об условных объединениях, но немного борюсь здесь, и любая помощь будет приветствоваться, спасибо!

Спасибо, Гордон, за ваш ответ на этот вопрос для меня это работает почти правильно, за исключением того факта, что каждая из записей в обработке таблицы помещается на отдельной строке, а не объединяется на одной строке, как я и надеялся. Используя ваше решение, я получаю;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   |                       |                   
22222   | Apple | 2020/02/23    |                       | 2020/02/23 10:15:23   |                    
22222   | Apple | 2020/02/23    |                       |                       | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   |                       | 
33333   | Pear  | 2020/02/23    |                       | 2020/02/23 09:08:43   |
33333   | Pear  | 2020/02/23    |                       |                       | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   |                       | 
44444   | Banana| 2020/02/23    |                       | 2020/02/23 09:33:28   | 
44444   | Banana| 2020/02/23    |                       |                       | 2020/02/23 11:38:01

Вместо того результата, которого я хотел достичь ниже;

Ref     | Fruit | DateOrdered   | DateReceipt           | DateRepack            | DateDispatch
-----------------------------------------------------------------------------------------------------
22222   | Apple | 2020/02/23    | 2020/02/23 09:34:03   | 2020/02/23 10:15:23   | 2020/02/23 10:32:11
33333   | Pear  | 2020/02/23    | 2020/02/23 08:34:55   | 2020/02/23 09:08:43   | 2020/02/23 10:43:21
44444   | Banana| 2020/02/23    | 2020/02/23 07:23:32   | 2020/02/23 09:33:28   | 2020/02/23 11:38:01

1 Ответ

0 голосов
/ 05 марта 2020

Вы можете использовать условное агрегирование:

SELECT o.Ref, o.Fruit, 
       MAX(CASE WHEN p.ProcessID = 'RECEIPT' THEN ProcessDateTime END) as receipt,
       MAX(CASE WHEN p.ProcessID = 'REPACK' THEN ProcessDateTime END) as repack,
       MAX(CASE WHEN p.ProcessID = 'DISPATCH' THEN ProcessDateTime END) as dispatch
FROM Orders o LEFT JOIN
     Processing p
     ON p.Fruit = o.Fruit
WHERE o.OrderDate BETWEEN date1 AND date2
GROUP BY o.Ref, o.Fruit;
...