Вот мой текущий набор данных.
| BIMUnique | Description | Quantity | SuperiorUnique | LineCode |
|-----------|--------------------------------------------|----------|----------------|-----------|
| 660084 | Top Level Order Description | 1 | 0 | 01 |
| 660085 | Second Level Order Description | 50 | 660084 | 01 |
| 660086 | Second Level Order Description w/sub order | 200 | 660084 | 02 |
| 660087 | Third Level Order Description | 10 | 660086 | 07 |
Я хотел бы получить что-то вроде этого
| Top Level Description | Immediate Parent | Item Description | Navigation (LineCode Concatenation) | Qty |
|-----------------------------|--------------------------------------------|--------------------------------------------|-------------------------------------|-----|
| Top Level Order Description | 0 | Top Level Order Description | 01 | 1 |
| Top Level Order Description | Top Level Order Description | Second Level Order Description | 01.01 | 50 |
| Top Level Order Description | Top Level Order Description | Second Level Order Description w/sub order | 01.02 | 200 |
| Top Level Order Description | Second Level Order Description w/sub order | Third Level Order Description | 01.02.07 | 10 |
У моего текущего CTE есть две проблемы - во-первых, он не показывает Родитель верхнего уровня, только непосредственный. А во-вторых, ROW_NUMBER просто считает строки и не отражает LineCode. Если мои конечные пользователи создают 3 элемента списка, а затем удаляют элемент № 2, система go не возвращает и не переупорядочивает номера строк.
WITH bi AS
(
SELECT
m.*,
CAST(ROW_NUMBER() OVER (ORDER BY m.LineCode) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS Tree
FROM BidItems m with (nolock)
WHERE m.SuperiorUnique = 0 AND m.JobUnique = '12591'
UNION ALL
SELECT
m.*,
bi.Tree + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.SuperiorUnique ORDER BY m.LineCode) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
FROM BidItems m with (nolock)
JOIN bi ON m.SuperiorUnique = bi.BIMUnique
WHERE m.JobUnique = '12591'
)
SELECT
Job.Number,
Job.Description,
bi.Tree,
bi.LineCode,
bi.Description,
bi.Quantity,
bi.TotalCosts,
bi.*
FROM Job AS job with (nolock)
INNER JOIN bi ON bi.JobUnique = Job.JOBUnique
INNER JOIN BidItems AS sup with (nolock) ON bi.SuperiorUnique = sup.BIMUnique
LEFT JOIN BidItemDetail AS bid with (nolock) ON bid.BidItemUnique = bi.BIMUnique
ORDER BY Bi.Tree
И мы находимся в MS SQL 2012
Обновлено: LineOrder должен быть LineCode.