es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Declaración recursiva con división del valor de la columna

Tengo una tabla llamada “srt_shipped_tools” con algunas columnas como se muestra en la imagen mencionada a continuación:

shipped_tools

Tomemos la primera fila de la tabla anterior. Vemos la columna Partpath, en la columna Partpath tenemos múltiples ids separados por “/” el último valor separado (0010-36299) es hijo de (0010-81717) y el valor (0010-81717) es hijo de (0241-07133) y así sucesivamente.

Resultado esperado: el valor de Partpath debe separarse con “/” y el resultado debe ser como la imagen adjunta.

enter image description here

Intenté una expresión CTE utilizando recursión, pero no está funcionando para mí.

Intenté con la siguiente consulta utilizando la técnica de recursión, pero no está funcionando como se esperaba.

;WITH Numbers AS (
    SELECT Partpath, partno, parentpartno, slot_num, consumptionenditem, plant
    FROM srt_shipped_tools
    WHERE slot_num = '901013' and PARTNO = '0015-08223' 
    UNION ALL
    SELECT a.Partpath, a.partno, a.parentpartno, a.slot_num, a.consumptionenditem, a.plant
    FROM srt_shipped_tools a 
    INNER JOIN Numbers b on a.slot_num = b.slot_num and a.plant = b.plant and a.consumptionenditem = b.consumptionenditem and a.parentpartno = b.partno 
    WHERE a.slot_num = '901013' and a.PARTNO = '0015-08223'
)
SELECT *
FROM Numbers
WHERE slot_num = '901013' and PARTNO = '0015-08223'
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado esperado, necesitamos utilizar una CTE (Expresión Común de Tabla) recursiva. Aquí hay un ejemplo de consulta que debería funcionar:

    WITH PartHierarchy AS (
      -- Miembro ancla: Obtener el nivel principal de la parte padre y de la parte hijo
      SELECT 
        Partpath,
        LEFT(Partpath, CHARINDEX('/', Partpath) - 1) ParentPart,
        STUFF(Partpath, 1, CHARINDEX('/', Partpath), '') ChildPart,
        1 AS PartLevel
      FROM srt_shipped_tools
    
      UNION ALL
    
      -- Miembro recursivo: Unir con la misma tabla para obtener el siguiente nivel de partes padre e hijo
      SELECT 
        s.Partpath,
        p.ParentPart,
        STUFF(s.Partpath, 1, CHARINDEX('/', s.Partpath), '') ChildPart,
        p.PartLevel + 1 AS PartLevel
      FROM srt_shipped_tools s
      INNER JOIN PartHierarchy p ON p.ChildPart = LEFT(s.Partpath, CHARINDEX('/', s.Partpath) - 1)
    )
    -- Selección final: Pivotar los datos para obtener la salida deseada
    SELECT 
      MAX(CASE WHEN PartLevel = 1 THEN ParentPart END) Nivel1,
      MAX(CASE WHEN PartLevel = 2 THEN ParentPart END) Nivel2,
      MAX(CASE WHEN PartLevel = 2 THEN ChildPart END) Valor2,
      MAX(CASE WHEN PartLevel = 3 THEN ParentPart END) Nivel3,
      MAX(CASE WHEN PartLevel = 3 THEN ChildPart END) Valor3,
      MAX(CASE WHEN PartLevel = 4 THEN ParentPart END) Nivel4,
      MAX(CASE WHEN PartLevel = 4 THEN ChildPart END) Valor4,
      MAX(CASE WHEN PartLevel = 5 THEN ParentPart END) Nivel5,
      MAX(CASE WHEN PartLevel = 5 THEN ChildPart END) Valor5
    FROM PartHierarchy
    WHERE Partpath = '0241-07133/0010-81717/0010-36299'
    

    Esta consulta debería devolver una sola fila con los valores de la ruta de la parte divididos en columnas separadas, como se muestra en la imagen de salida esperada. Ten en cuenta que deberás modificar la cláusula WHERE para que coincida con el valor específico de la ruta de la parte que deseas consultar.

Comments are closed.