【发布时间】:2021-06-15 23:43:15
【问题描述】:
我有多个返回此结果的嵌套 cte
WITH X AS (
SELECT BATCH, CHILD_BATCH, 0 AS LVL,
N'/' + CONVERT(NVARCHAR(4000),BATCH) + N'/' + CONVERT(NVARCHAR(4000),CHILD_BATCH) + N'/' AS HIERARCHY
FROM MYTABLE
WHERE BATCH = @LOTTO_INIZIALE
UNION ALL
SELECT T.BATCH, T.CHILD_BATCH, X.LVL + 1 AS LVL, X.HIERARCHY + CONVERT(NVARCHAR(4000), L.CHILD_BATCH) + N'/'
FROM MYTABLE T INNER JOIN X ON T.BATCH = X.CHILD_BATCH
)
SELECT * FROM X
╔════════╦═════════════╦═════════════════════════════════════════════╦═════╗
║ BATCH ║ CHILD_BATCH ║ HIERARCHY ║ LVL ║
╠════════╬═════════════╬═════════════════════════════════════════════╬═════╣
║ NZ1677 ║ NZ1671 ║ /NZ1677/NZ1671/ ║ 0 ║
║ NZ1671 ║ NZ1646 ║ /NZ1677/NZ1671/NZ1646/ ║ 1 ║
║ NZ1646 ║ NZ1125 ║ /NZ1677/NZ1671/NZ1646/NZ1125/ ║ 2 ║
║ NZ1125 ║ NZ0960 ║ /NZ1677/NZ1671/NZ1646/NZ1125/NZ0960/ ║ 3 ║
║ NZ0960 ║ NY2443 ║ /NZ1677/NZ1671/NZ1646/NZ1125/NZ0960/NY2443/ ║ 4 ║
║ NZ1677 ║ NZ1672 ║ /NZ1677/NZ1672/ ║ 0 ║
║ NZ1672 ║ NZ1646 ║ /NZ1677/NZ1672/NZ1646/ ║ 1 ║
║ NZ1646 ║ NZ1125 ║ /NZ1677/NZ1672/NZ1646/NZ1125/ ║ 2 ║
║ NZ1125 ║ NZ0960 ║ /NZ1677/NZ1672/NZ1646/NZ1125/NZ0960/ ║ 3 ║
║ NZ0960 ║ NY2443 ║ /NZ1677/NZ1672/NZ1646/NZ1125/NZ0960/NY2443/ ║ 4 ║
║ NZ1672 ║ NZ1647 ║ /NZ1677/NZ1672/NZ1647/ ║ 1 ║
║ NZ1647 ║ NZ1444 ║ /NZ1677/NZ1672/NZ1647/NZ1444/ ║ 2 ║
║ NZ1444 ║ NZ1442 ║ /NZ1677/NZ1672/NZ1647/NZ1444/NZ1442/ ║ 3 ║
║ NZ1442 ║ NY2443 ║ /NZ1677/NZ1672/NZ1647/NZ1444/NZ1442/NY2443/ ║ 4 ║
╚════════╩═════════════╩═════════════════════════════════════════════╩═════╝
我希望为同一个层次结构节点获得一个具有相同值的新列,如下所示:
╔════════╦═════════════╦═════════════════════════════════════════════╦═════╦═════╗
║ BATCH ║ CHILD_BATCH ║ HIERARCHY ║ LVL ║ IX ║
╠════════╬═════════════╬═════════════════════════════════════════════╬═════╬═════╣
║ NZ1677 ║ NZ1671 ║ /NZ1677/NZ1671/ ║ 0 ║ 1 ║
║ NZ1671 ║ NZ1646 ║ /NZ1677/NZ1671/NZ1646/ ║ 1 ║ 1 ║
║ NZ1646 ║ NZ1125 ║ /NZ1677/NZ1671/NZ1646/NZ1125/ ║ 2 ║ 1 ║
║ NZ1125 ║ NZ0960 ║ /NZ1677/NZ1671/NZ1646/NZ1125/NZ0960/ ║ 3 ║ 1 ║
║ NZ0960 ║ NY2443 ║ /NZ1677/NZ1671/NZ1646/NZ1125/NZ0960/NY2443/ ║ 4 ║ 1 ║
║ NZ1677 ║ NZ1672 ║ /NZ1677/NZ1672/ ║ 0 ║ 2 ║
║ NZ1672 ║ NZ1646 ║ /NZ1677/NZ1672/NZ1646/ ║ 1 ║ 2 ║
║ NZ1646 ║ NZ1125 ║ /NZ1677/NZ1672/NZ1646/NZ1125/ ║ 2 ║ 2 ║
║ NZ1125 ║ NZ0960 ║ /NZ1677/NZ1672/NZ1646/NZ1125/NZ0960/ ║ 3 ║ 2 ║
║ NZ0960 ║ NY2443 ║ /NZ1677/NZ1672/NZ1646/NZ1125/NZ0960/NY2443/ ║ 4 ║ 2 ║
║ NZ1672 ║ NZ1647 ║ /NZ1677/NZ1672/NZ1647/ ║ 1 ║ 3 ║
║ NZ1647 ║ NZ1444 ║ /NZ1677/NZ1672/NZ1647/NZ1444/ ║ 2 ║ 3 ║
║ NZ1444 ║ NZ1442 ║ /NZ1677/NZ1672/NZ1647/NZ1444/NZ1442/ ║ 3 ║ 3 ║
║ NZ1442 ║ NY2443 ║ /NZ1677/NZ1672/NZ1647/NZ1444/NZ1442/NY2443/ ║ 4 ║ 3 ║
╚════════╩═════════════╩═════════════════════════════════════════════╩═════╩═════╝
有可能吗?
如果有多个分层子节点,我还希望重复级别 0。 (例如/NZ1677/NZ1672/)
编辑
解释起来有点复杂,但我试试。
在我的表中,我有一个包含一个或多个孩子的批次列表。
对于每个层次结构级别,我可以有一个 o 加子级别。
在每一行中,我都有批次和子项的数量。
例如,另一个批次可以是这样的(如果有帮助,我还添加了“prev_batch”列):
+------------+--------+-------------+-----------+-----------+------------------------+-----+
| PREV_BATCH | BATCH | CHILD_BATCH | BATCH_QTY | CHILD_QTY | HIERARCHY | LVL |
+------------+--------+-------------+-----------+-----------+------------------------+-----+
| | NB0166 | NA1367M | 119.3700 | 0.0450 | /NB0166/NA1367M/ | 0 |
| | NB0166 | NA1938M | 119.3700 | 0.0650 | /NB0166/NA1938M/ | 0 |
| | NB0166 | NA3204S | 119.3700 | 0.0270 | /NB0166/NA3204S/ | 0 |
| | NB0166 | NB0019 | 119.3700 | 18.0400 | /NB0166/NB0019/ | 0 |
| NB0166 | NB0019 | NA3938 | 109.6700 | 100.0000 | /NB0166/NB0019/NA3938/ | 1 |
| | NB0166 | NB0021 | 119.3700 | 91.9600 | /NB0166/NB0021/ | 0 |
| NB0166 | NB0021 | NA1924 | 109.7400 | 40.0000 | /NB0166/NB0021/NA1924/ | 1 |
| NB0166 | NB0021 | NA2251 | 109.7400 | 10.0000 | /NB0166/NB0021/NA2251/ | 1 |
| NB0166 | NB0021 | NA2616 | 109.7400 | 50.0000 | /NB0166/NB0021/NA2616/ | 1 |
+------------+--------+-------------+-----------+-----------+------------------------+-----+
我的想法是为每个层次结构节点添加具有相同值的 IX 列(就像我在上面解释的那样)。
我想用lead函数读取下一级批次的数量(我需要做一些计算)。
使用 IX 列,我可以正确划分潜在客户。
对完成这项任务的最佳想法持开放态度。
【问题讨论】:
-
旁白:
;WITH终止了什么?为什么不是声明terminated? -
帖子已编辑以澄清
-
我会假设 BATCH_QTY = SUM(CHILD_QTY) 但这不是您的数据所暗示的。您能否阐明数据中的数量列之间的关系?
-
批次数量不是孩子的总和,因为它是一个产品从自己的原材料中生产出来的数量。推理也反映在每个子批次中。
标签: sql sql-server tsql common-table-expression hierarchical-data