Команда SQL для фильтрации на основе нескольких таблиц и критериев - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь выучить sql, это сводит меня с ума. Я не могу понять правильный синтаксис для достижения желаемого результата. Я смотрю видео на udemy и читаю книги по основному SQL, пытаясь научить себя, но кажется, что все они не помогают мне преодолеть этот пробел, который я, кажется, не могу преодолеть.

У меня довольнохорошо разбирается в основах команд SELECT, FROM, WHEN. Кажется, я получаю знания об использовании агрегатных функций, но я ни в коем случае не эксперт.

У меня есть две таблицы: "Orders" и "OrderDet". «Заказы» содержат CustomerName и OrderNo, а OrderDet содержит все остальное, например PartNo, DateFinished, OrderNo и т. Д.

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

Например

SELECT Orders.CustDesc, OrderDet.OrderNo, OrderDet.PartNo, OrderDet.DateFinished
FROM Orders
JOIN OrderDet ON Orders.OrderNo = OrderDet.OrderNo
ORDER BY OrderDet.PartNo, OrderDet.DateFinished

Этот запрос возвращает:

Customer   OrderNo   PartNo     Date Finished
--------------------------------------------------------
Cust 1      5032    12345678-1  NULL
Cust 2     10032    12345678-1  2019-06-05 14:54:25.853
Cust 2      1048    12345678-1  2019-07-08 00:00:00.000
Cust 1      5028    12345678-1  2019-09-30 11:45:45.960
Cust 1      5029    12345678-1  2019-09-30 12:49:35.713
Cust 1      5030    12345678-1  2019-09-30 13:04:57.333
Cust 1      5031    12345678-1  2019-10-10 13:58:22.653

Я все еще изучаю, когда и какиспользовать агрегатную функцию, но, кажется, не в состоянии полностью понять концепцию. Я пытался использовать MAX для столбца Date и GROUP BY Customer и PartNo, но до тех пор, пока я не удалю номер заказа, выходные данные никогда не упадут до того, что я хочу.

Например, я использовал:

SELECT Orders.CustDesc, OrderDet.PartNo, MAX(OrderDet.DateFinished)
FROM Orders
JOIN OrderDet ON Orders.OrderNo = OrderDet.OrderNo
GROUP BY Orders.CustDesc, OrderDet.PartNo
ORDER BY OrderDet.PartNo

Удаление OrderDet.OrderNo из SELECT и OrderDet.DateFinished из Order By. Это возвращает желаемый вывод строки, но не хватает всех нужных столбцов.

Customer  PartNo     Date Finished
--------------------------------------------
Cust 2  12345678-1  2019-07-08 00:00:00.000
Cust 1  12345678-1  2019-10-10 13:58:22.653

Как только я пытаюсь добавить OrderNo обратно в микс, я получаю тот же вывод, что и первый. Я думаю, что понимаю, почему это происходит, потому что все OrderNo уникальны и не могут быть сгруппированы, но я не могу понять, как это преодолеть.

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

Опять же, я пытаюсь изучить этот материал, и я могу только читать и перечитывать один и тот же базовый контент, чтобы научиться делать это так долго. Кажется, во всем, что я читаю, не хватает информации, которая нужна моему мозгу для того момента "АХ ХА".

Возможно, кто-то может помочь преодолеть этот разрыв?

1 Ответ

1 голос
/ 03 ноября 2019

Я интерпретирую ваш вопрос как запрос последнего заказа для данного клиента для каждой заказанной им детали.

Для этого я бы порекомендовал функции окна:

select CustDesc, OrderNo, od.DateFinished
from (select o.custdesc, od.orderno, od.partno, od.datefinished,
             row_number() over (partition by o.custdesc, od.partno order by od.datefinished desc) as seqnum
      from Orders o join
           orderdet od
           on o.OrderNo = od.OrderNo
     ) od
where seqnum = 1;
order by od.PartNo, od.DateFinished
...