SQL FIDDLE (astAssets
опущен, чтобы уменьшить сложность)
Мне нужен список определенных задач обслуживания для актива, вместе с их соответствующимиколичество подзадач и запасных частей.
Задачи связаны с активами, а подзадачи и запасные части находятся в отдельных таблицах, связанных с задачами с идентификаторами.
Таким образом, следующие два запроса будут соответственнополучить все подзадачи и задачи из всех активов
Select T.Code, ST.Description From astTasks T
Join astTaskSubTasks ST ON ST.ParentId = T.Id
Join astAssets A ON A.Id = T.AssetId
Select T.Code, S.StockItemId From astTasks T
Join astTaskSpares S ON S.ParentId = T.Id
Join astAssets A ON A.Id = T.AssetId
Описание записей подзадач содержит код товара.Запасные записи связаны с кодом элемента запаса с помощью StockItemId
.
. Я хочу получить список всех задач в активе вместе со всеми подзадачами и запасными частями для этих задач.Подзадачи и запасные части часто (но не всегда) относятся к одним и тем же товарам на складе.Например, задача A
содержит подзадачу, в которой указано, что товарная позиция 0990
будет заменяться каждые 12 месяцев, и, следовательно, товарная позиция 0990
была включена в список запасных частей для этой задачи.
Проблема заключается в том, что подзадачи и запасные части не имеют связи между ними, даже если они иногда четко связаны (как в примере выше).
Чтобы усложнить задачу:
- Задачи страхового запаса содержат запасные части, но не имеют подзадач (ничего не нужно делать)
- Для некоторых подзадач требуется только запасэлемент, подлежащий визуальной проверке, и, следовательно, нет соответствующих запасных частей
- Запасные части могут отсутствовать как ошибка пользователя
- Подзадачи и запасные части отсутствуют в задаче, которая является другой ошибкой пользователя
Я хочу перечислить код товара, задачу, описание подзадачи и количество запасных частей, даже если подзадачи, запасные части или оба отсутствуют. Приведенный ниже запрос не работает, так как он может 't связать запасные части с подзадачами.В результате один запасной элемент может быть указан несколько раз для одной и той же задачи с разными количествами, поскольку он получает количества из всех запасных частей в этой задаче.В результате вы можете ошибочно получить 4 записи для одного товара.
Select Distinct
CASE WHEN ST.Description IS NULL THEN SI.Code ELSE LTRIM(SUBSTRING(ST.Description, CHARINDEX('x ' , Substring(ST.Description, PATINDEX('%(%[^A-Z]% x %', ST.Description),50) ) + PATINDEX('%(%[^A-Z]% x %', ST.Description)+1, (CHARINDEX(') - (', ST.Description) - (CHARINDEX('x ' , Substring(ST.Description, PATINDEX('%(%[^A-Z]% x %', ST.Description),50) ) + PATINDEX('%(%[^A-Z]% x %', ST.Description)))-1)) END
, T.Code
, Left(ST.Description, CHARINDEX(' ',ST.Description, 1))
, CASE WHEN Left(ST.Description, CHARINDEX(' ',ST.Description, 1)) = 'Check' Then 'Check' ELSE CAST(S.Quantity as nvarchar) END
From astTasks T
Join astAssets A ON A.Id = T.AssetId
Left Join astTaskSubTasks ST ON ST.ParentId = T.Id
Left Join astTaskSpares S ON S.ParentId = T.Id
Left Join stkStockItems SI ON SI.Id = S.StockItemId
Where
A.Code = '2016404991'
На изображении ниже показан скриншот из fiddle и показана проблема.Верхняя таблица - это список всех запчастей (столбец 2) в соответствующих задачах (столбец 1) с соответствующими количествами (столбец 3).Вторая таблица была построена с запросом выше.Как вы можете заметить, он отображает коды запаса с неправильными запасными количествами.Он просто показывает все возможные комбинации для этой конкретной задачи и запаса.