SQL Server Сортировка рекурсивной таблицы

У меня есть следующая рекурсивная таблица (родители и дети):

introducir la descripción de la imagen aquí

Мне нужно сделать запрос, который возвращает следующий результат:

introducir la descripción de la imagen aquí

Как вы увидите, я хочу, чтобы все дети отца были разбиты (например, не текущие активы), чтобы все дети следующего отца (ТЕКУЩИЕ АКТИВЫ). Если у вас есть какие-либо вопросы по поводу моего запроса, сообщите мне.

Вот сценарий в таблице:

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')

Спасибо за вашу помощь.

1
задан 27.11.2019, 17:32
2 ответа

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;
0
ответ дан 01.12.2019, 10:46

С перекурсивным 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;
0
ответ дан 01.12.2019, 10:46
  • 1
    Порядок - один из важных точек моей проблемы. solució n, что enví эксперт не возвращает порядок, в котором я нуждаюсь. – Walter Corpus 27.11.2019, 17:58
  • 2
    Я изменил có я говорю для añ adir ordenació n segú n jerarquí в – Roger Torné 27.11.2019, 18:02

Теги

Похожие вопросы