Соединение двух таблиц и необходимость иметь агрегатную функцию MAX в предложении ON - PullRequest
0 голосов
/ 21 апреля 2020

Это мой код! Я хочу указать в своем отчете идентификатор детали и идентификатор заказа на поставку, и он содержит всю связанную информацию с этими спецификациями. Важно то, что если у нас одинаковый идентификатор заказа на покупку и идентификатор детали, нам нужен код для возврата результата с наибольшим идентификатором транзакции. Следующий код не обеспечивает то, что я ожидал. Не могли бы вы мне помочь?

SELECT MAX(INVENTORY_TRANS.TRANSACTION_ID), INVENTORY_TRANS.PART_ID
, INVENTORY_TRANS.PURC_ORDER_ID, TRACE_INV_TRANS.QTY, TRACE_INV_TRANS.CREATE_DATE, TRACE_INV_TRANS.TRACE_ID
FROM INVENTORY_TRANS    
JOIN TRACE_INV_TRANS ON INVENTORY_TRANS.TRANSACTION_ID = TRACE_INV_TRANS.TRANSACTION_ID    
WHERE INVENTORY_TRANS.PART_ID = @PartID 
    AND INVENTORY_TRANS.PURC_ORDER_ID = @PurchaseOrderID    
GROUP BY TRACE_INV_TRANS.QTY, TRACE_INV_TRANS.CREATE_DATE, TRACE_INV_TRANS.TRACE_ID, INVENTORY_TRANS.PART_ID
, INVENTORY_TRANS.PURC_ORDER_ID

Пример таблицы trace_inventory_trans:

part_id   trace_id    transaction id     qty       create_date     
x           1             10
x           2             11
x           3             12

Пример таблицы инвентаризации:

transaction_id     part_id     purc_order_id
11                 x            p20
12                 x            p20

Я хотел есть результат самой большой транзакции, которая является транзакцией 12, но она показывает мне транзакцию 11

1 Ответ

0 голосов
/ 21 апреля 2020

Я бы использовал подзапрос, чтобы найти значение MAX, а затем соединил бы этот результат с другой таблицей.

ORDER BY + TOP (1) возвращает значение MAX для transaction_id.

SELECT 
   inv.transaction_id
  ,inv.part_id
  ,inv.purc_order_id
  ,tr.qty
  ,tr.create_date
  ,tr.trace_id
FROM 
  (
    SELECT TOP (1)
      transaction_id,
      part_id,
      purc_order_id
    FROM 
      INVENTORY_TRANS
    WHERE 
      part_id = @PartID
      AND 
      purc_order_id = @PurchaseOrderID
    ORDER BY 
      transaction_id DESC
  ) AS inv
JOIN 
  TRACE_INV_TRANS AS tr
    ON inv.transaction_id = tr.transaction_id;

Результаты:

+----------------+---------+---------------+------+-------------+----------+
| transaction_id | part_id | purc_order_id | qty  | create_date | trace_id |
+----------------+---------+---------------+------+-------------+----------+
|             12 | x       | p20           | NULL | NULL        |        3 |
+----------------+---------+---------------+------+-------------+----------+

Rextester Demo

...