У меня есть следующая рекурсивная таблица (родители и дети):
Мне нужно сделать запрос, который возвращает следующий результат:
Как вы увидите, я хочу, чтобы все дети отца были разбиты (например, не текущие активы), чтобы все дети следующего отца (ТЕКУЩИЕ АКТИВЫ). Если у вас есть какие-либо вопросы по поводу моего запроса, сообщите мне.
Вот сценарий в таблице:
CREATE TABLE secDefinicionBalance(
BalanceID int NOT NULL,
Codigo varchar(8) NULL,
Nivel int NULL,
Descripcion varchar(100) NULL,
Signo int NULL,
PadreID int NULL,
Arbol char(1) NULL
)
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (1, N'A', 1, N'ACTIVO', 0, 0, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (2, N'A', 2, N'ACTIVO NO CORRIENTE', 0, 1, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (3, N'B', 2, N'ACTIVO CORRIENTE', 0, 1, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (4, N'I', 3, N'Inmovilizado Intangible', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (5, N'II', 3, N'Inmovilizado material', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (6, N'III', 3, N'Inversiones inmobiliarias', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (7, N'IV', 3, N'Inversiones en empresas del grupo y asociadas a largo plazo', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (8, N'V', 3, N'Inversiones financieras a largo plazo', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (9, N'VI', 3, N'Activos por impuesto diferido', 0, 2, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (10, N'I', 3, N'Activos no corrientes mantenidos para la venta', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (11, N'II', 3, N'Existencias', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (12, N'III', 3, N'Deudores comerciales y otras cuentas a cobrar', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (13, N'IV', 3, N'Inversiones en empresas del grupo y asociadas a corto plazo', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (14, N'V', 3, N'Inversiones financieras a corto plazo', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (15, N'VI', 3, N'Periodificaciones a corto plazo', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (16, N'VII', 3, N'Efectivo y otros activos líquidos equivalentes', 0, 3, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (17, N'1', 4, N'Desarrollo', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (18, N'2', 4, N'Concesiones', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (19, N'3', 4, N'Patentes, licencias, marcas y similares', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (20, N'4', 4, N'Fondo de comercio', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (21, N'5', 4, N'Aplicaciones informáticas', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (22, N'6', 4, N'Otro inmovilizado intangible', 0, 4, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (23, N'1', 4, N'Terrenos y construcciones', 0, 5, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (24, N'2', 4, N'Instalaciones técnicas y otro inmovilizado material', 0, 5, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (25, N'3', 4, N'Inmovilizado en curso y anticipos', 0, 5, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (26, N'1', 4, N'Terrenos', 0, 6, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (27, N'2', 4, N'Construcciones', 0, 6, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (28, N'1', 4, N'Instrumentos de patrimonio', 0, 7, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (29, N'2', 4, N'Créditos a empresas', 0, 7, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (30, N'3', 4, N'Valores representativos de deuda', 0, 7, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (72, N'201', 5, N'Cuenta 201', 1, 17, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (73, N'2801', 5, N'Cuenta 2801', 1, 17, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (74, N'2901', 5, N'Cuenta 2901', 1, 17, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (75, N'202', 5, N'Cuenta 202', 1, 18, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (76, N'2802', 5, N'Cuenta 2802', 1, 18, N'A')
INSERT secDefinicionBalance (BalanceID, Codigo, Nivel, Descripcion, Signo, PadreID, Arbol) VALUES (77, N'2902', 5, N'Cuenta 2902 abc', 1, 18, N'A')
Спасибо за вашу помощь.
método mÃ: s заслуживающий доверия, который я нашел для этого, состоит в том, чтобы прилагать стоимость в varbinary производить заслуживающий доверия маршрут. Я оставляю opci¦n делания этого и ademÃ: s маршрут, который служит для того, чтобы сделать это mÃ: s дружеский в человеческий глаз.
WITH cteDefinicionBalance AS (
SELECT BalanceID,
Codigo,
Nivel,
Descripcion,
Signo,
PadreID,
Arbol,
Ruta = CAST( Nivel AS varchar(8000)), --Ruta legible para humanos
RutaJerarquica = CAST(BalanceID AS VARBINARY(max)) --Ruta confiable para orden.
FROM dbo.secDefinicionBalance
WHERE Nivel = 1
UNION ALL
SELECT db.BalanceID,
db.Codigo,
db.Nivel,
db.Descripcion,
db.Signo,
db.PadreID,
db.Arbol,
Ruta = c.Ruta + '.' + CAST( db.Nivel AS varchar(10)),
RutaJerarquica = c.RutaJerarquica + CAST( db.BalanceID AS varbinary(max))
FROM dbo.secDefinicionBalance db
INNER JOIN cteDefinicionBalance c ON db.PadreID = c.BalanceID
)
SELECT *
FROM cteDefinicionBalance
ORDER BY RutaJerarquica;
С перекурсивным CTE ты можешь получать это, хотя deberÃ: s тестировать ordenaci¦n, что mÃ: s подойдите тебе.
WITH CTE AS (
SELECT BalanceID, PadreID, Nivel, Descripcion, CAST(BalanceID AS varbinary(max)) AS Orden
FROM secDefinicionBalance
WHERE PadreID = 0
UNION ALL
SELECT t.BalanceID, t.PadreID, t.Nivel, t.Descripcion, Orden + CAST(t.PadreID AS varbinary(max)) AS Orden
FROM secDefinicionBalance t
INNER JOIN CTE c ON t.PadreID = c.BalanceID
)
SELECT * FROM CTE
ORDER BY Orden;