Я искал пример такого вопроса, я прошу благодати, если на него был дан ответ (я думал, что это будет, но мне трудно найти значимые результаты с терминами, которые я искал.)
Я работаю на заводе-изготовителе, где при каждой производственной операции детали присваивается новый серийный номер. В таблице базы данных, с которой мне приходится работать, серийный номер записан в поле Container
, а предыдущий серийный номер детали записан в поле From_Container
.
Я пытаюсь SUM
колонку Extended_Cost
на частях, над которыми нам пришлось повторно выполнять операции.
Вот пример данных из tbl_Container
:
Container From_Container Extended_Cost Part_Key Operation
10 9 10 PN_100 60
9 8 10 PN_100 50
8 7 10 PN_100 40
7 6 10 PN_100 30
6 5 10 PN_100 20
5 4 10 PN_100 50
4 3 10 PN_100 40
3 2 10 PN_100 30
2 1 10 PN_100 20
1 100 10 PN_100 10
В этом примере SUM
, как я ожидаю, будет равно 40, потому что операции 20, 30, 40 и 50 были переделаны и стоили 10 долларов каждая.
До сих пор мне удавалось это делать, присоединяя таблицу к самой себе 10 раз, используя псевдонимы следующим образом:
LEFT OUTER JOIN tbl_Container AS FCP_1
ON tbl_Container.From_Container = FCP_1.Container
AND FCP_1.Operation <= tbl_Container.Operation
AND tbl_Container.Part_Key = FCP_1.Part_Key
А затем с помощью SUM
сложите вместе Extended_Cost
полей. Однако я нарушаю принцип DRY, и должен быть лучший способ.
Заранее спасибо за вашу помощь,
Me
hierarchyid
для представления иерархий. Или вы можете использовать рекурсивные CTE. Нет причин использовать циклы. - person Panagiotis Kanavos   schedule 18.01.2018Bill of Materials
(BOM). Google дляT-SQL BOM
для различных решений. Если материал/компонент используется только в одном продукте/объекте/чем-то еще верхнего уровня, это, по сути, иерархический запрос, который можно ускорить с помощьюhierarchyid
.hierarchyid
— это, по сути, путь от текущего элемента к вершине, поэтому он может представлять только одну иерархию. Если компонент используется в нескольких продуктах, вам нужен либо рекурсивный CTE, либо другая таблица с возможными путями (сложно) - person Panagiotis Kanavos   schedule 18.01.2018T-SQL BOM
. Это ни в коем случае не простая/решаемая проблема, и есть много методов, которые могут помочь. Рекурсия может быть слишком глубокой, или могут быть циклы, которые могут привести к бесконечной рекурсии. Возможно, вы захотите рассчитать более сложный агрегат (цена с скидками за объем). Графические решения также могут помочь. - person Panagiotis Kanavos   schedule 18.01.2018from_container
имеет значение100
? Я бы ожидал, что это значение будетNULL
, если бы это была первая операция. Кроме того, соединение в вашем примере ссылается на столбецpart_key
, но не видно его в данных примера. Вы не против добавить это? - person tarheel   schedule 19.01.2018Part_No
наPart_Key
, ошибка с моей стороны. Кроме того,from_container
относится к серийным номерам, поэтому 100 просто указывает на то, что входная часть для первого шага также имеет серийный номер. Я мог выбрать любой номер. Стоит отметить, чтоContainer_No
генерируется по мере того, как детали производятся на нашем предприятии. В моем простом примере числа идут одно за другим, но на самом деле мы производим сотни деталей в час, поэтому числа никогда не идут одно за другим. - person Python_Learner_DK   schedule 19.01.2018Container
не являются последовательными в фактических данных. Если бы те же 10 записей выборочных данных находились в середине 1000 других записей, что я мог бы использовать, чтобы определить, с чего началось создание детали? Я бы предположил, что могу найти, где закончилось создание части, когда нет записи, которая имеет значениеFrom_Container
, совпадающее со значениемContainer
(в данном случае значениеContainer
равно 10). Не возражаете ли вы добавить образцы данных для второй создаваемой части? Кроме того, какая у вас версия SQL Server? (2008/2012/2014/и т.д..) - person tarheel   schedule 20.01.2018