Я работаю в окне запроса в SSMS.
Использование 3 таблиц:
- WORK_ORDER wo
- Заказ на изготовление детали
- ОПЕРАЦИЯ op
- Операция по изготовлению детали (лазерная обработка, шлифование, покрытие и т. Д.)
- PART pt
- Уникальная запись, определяющая деталь
Моя цель - сообщить о состоянии операции (скажем, № 3) (# заказано всего деталей, # выполненочастей), но дополнительно включить в последовательность количество частей, которые завершили предыдущую операцию (# 2) и готовы к процессу.Мое решение состояло в том, чтобы использовать функцию LAG, которая отлично работает, когда вложенный оператор select, выполняемый ниже, выполняется независимо, но я получаю среднее 4-кратное дублирование в моих результатах, и мой столбец Completed_QTY_PREV_OP не отображается.Я знаю, что это потому, что это не в родительском операторе выбора, но я сначала хотел исправить соединение.Я предполагаю, что эти две проблемы связаны между собой.
Сноска: WHERE содержит фильтр, который вы можете игнорировать.Родительский оператор выбора отлично работает без присоединенного подзапроса.
Вот мой sql:
SELECT op.RESOURCE_ID, pt.USER_5 AS PRODUCT, wo.PART_ID, wo.TYPE, wo.BASE_ID,
wo.LOT_ID, wo.SPLIT_ID, wo.SUB_ID, op.SEQUENCE_NO, pt.DESCRIPTION,
wo.DESIRED_QTY, op.FULFILLED_QTY AS QTY_COMP, op.SERVICE_ID, op.DISPATCHED_QTY, wo.STATUS
FROM dbo.WORK_ORDER wo INNER JOIN
dbo.OPERATION op ON wo.TYPE = op.WORKORDER_TYPE
AND wo.BASE_ID = op.WORKORDER_BASE_ID
AND wo.LOT_ID = op.WORKORDER_LOT_ID
AND wo.SPLIT_ID = op.WORKORDER_SPLIT_ID
AND wo.SUB_ID = op.WORKORDER_SUB_ID INNER JOIN
dbo.PART pt ON wo.PART_ID = pt.ID
LEFT OUTER JOIN
--The nested select statement works by itself in a query window,
--but the JOIN throws an error.
(SELECT
pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID, pr.WORKORDER_LOT_ID,
pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO,
LAG (COMPLETED_QTY, 1) OVER (ORDER BY pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID,
pr.WORKORDER_LOT_ID, pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO) AS COMP_QTY_PREV_OP
FROM dbo.OPERATION AS pr) AS prev
--End of nested select
ON
op.WORKORDER_TYPE = prev.WORKORDER_TYPE AND
op.WORKORDER_BASE_ID = prev.WORKORDER_BASE_ID AND
op.WORKORDER_LOT_ID = prev.WORKORDER_LOT_ID AND
op.WORKORDER_SPLIT_ID = prev.WORKORDER_SPLIT_ID AND
op.WORKORDER_SUB_ID = prev.WORKORDER_SUB_ID
WHERE (NOT (op.SERVICE_ID IS NULL)) AND (wo.STATUS = N'R')