Valores SUM por número de secuencia y agrupados por indicador de grupo.
Tenemos una lista con un número de secuencia. La secuencia se romperá y luego comenzará de nuevo.
Como puedes ver a continuación, el campo SalesOrderLine
está faltando el número 4.
SalesOrder SalesOrderLine MStockCode MPrice MBomFlag
000000000182181 1 901337 0.00000 P
000000000182181 2 901335 2476.90000 C
000000000182181 3 340151 0.00000 C
000000000182181 5 900894 0.00000 P
000000000182181 6 400379 0.00000 C
000000000182181 7 900570 600.90000 C
Lo que estoy tratando de hacer es resumir el campo MPrice
por una secuencia de números consecutivos, luego utilizar el campo MBomFlag
para seleccionar el “padre”.
Este sería el resultado esperado de los datos anteriores. Cualquier agrupamiento se hará en el campo MBomFlag
si el valor es igual a P
.
SalesOrder SalesOrderLine MStockCode MPrice MBomFlag
000000000182181 1 901337 2476.90000 P
000000000182181 5 900894 600.90000 P
¿Cuál sería la mejor manera de abordar esto? Estoy tratando de averiguar algo utilizando RANK()
, ROW_NUMBER()
, LEAD
y LAG
pero no estoy teniendo mucho éxito.
Aquí está la fuente de los datos:
CREATE TABLE #SalesOrder (
SalesOrder NVARCHAR(20),
SalesOrderLine INT,
MStockCode INT,
MPrice DECIMAL(18,2),
MBomFlag VARCHAR(1))
INSERT INTO #SalesOrder (SalesOrder, SalesOrderLine, MStockCode, MPrice, MBomFlag)
SELECT '000000000182181', 1, '901337', 0.00000, 'P'
UNION
SELECT '000000000182181', 2, '901335', 2476.90000, 'C'
UNION
SELECT '000000000182181', 3, '340151', 0.00000, 'C'
UNION
SELECT '000000000182181', 5, '900894', 0.00000, 'P'
UNION
SELECT '000000000182181', 6, '400379', 0.00000, 'C'
UNION
SELECT '000000000182181', 7, '900570', 2600.90000, 'C'
SELECT *
FROM #SalesOrder
DROP TABLE #SalesOrder
davy.ai
Un enfoque para resolver este problema es utilizar una combinación de funciones de ventana y agregación condicional para identificar las secuencias consecutivas de líneas de orden de venta con números faltantes, agruparlas por el campo padre ‘MBomFlag’ y resumir el campo ‘MPrice’. Aquí hay una posible solución utilizando SQL Server:
Desglosemos la consulta anterior paso a paso:
Con los datos de muestra que proporcionaste, esta consulta produce el resultado esperado: