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.

CTE (expresión de tabla común) recursiva para dividir filas basadas en el valor de una columna.

Tengo una expresión de tabla común (CTE) que devuelve un conjunto de ID de artículo y cantidades. Estoy tratando de usar otra CTE para dividir cada fila en varias filas en función de un tamaño de contenedor definido. Por ejemplo, si el tamaño del contenedor se especifica como 20 y la cantidad de la fila es 49, me gustaría dividirla en 2 filas con cantidad de 20 y una fila de 9.

A continuación es donde estoy finalmente atascado. ¿Es una CTE recursiva la elección incorrecta para este escenario? Cualquier ayuda sería apreciada.

“`
DECLARE @ContainerSize int = 20;

WITH ItemDetails (ItemID, Qty) AS (
— Consulta que devuelve datos como los siguientes
SELECT 29, 49
UNION ALL
SELECT 33, 64
UNION ALL
SELECT 38, 32
UNION ALL
SELECT 41, 54
),
ItemDetailsSplit(n, ItemID, Qty) AS (
SELECT<br>
0,
ItemID,
Qty
FROM ItemDetails
UNION ALL
SELECT
n + 1,
ItemID,
CASE WHEN Qty < (@ContainerSize * (n + 1))
THEN Qty
ELSE Qty – (@ContainerSize * (n + 1))
END AS [Qty]<br>
FROM ItemDetailsSplit<br>
WHERE ( Qty > (@ContainerSize * n) )
)
SELECT *
FROM ItemDetailsSplit
ORDER BY ItemID, Qty DESC;
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que una CTE recursiva es una solución válida para dividir cada fila en múltiples filas basándose en un tamaño de contenedor definido en este escenario. Sin embargo, la implementación actual puede necesitar algunos ajustes. Un problema es el uso de los operadores “<” y “>” en lugar de “<=” y “>=” en la cláusula WHERE de la parte recursiva de la consulta, lo que puede resultar en inconsistencia en la división. Además, el algoritmo para dividir la cantidad en múltiples filas puede no ser correcto, ya que solo considera el resto después de la división por el tamaño del contenedor y no el cociente entero, que también debería generar una fila con tamaño de contenedor. Puede ser útil revisar la consulta y probar con varios escenarios para asegurar la salida correcta.

Comments are closed.