En Oracle, la función LISTAGG
me permite usarla analíticamente con una cláusula OVER (PARTITION BY column..)
. Sin embargo, no es compatible con el uso de ventanas con las palabras clave ROWS
o RANGE
.LISTAGG equivalente con la cláusula windowing
Tengo un conjunto de datos de un registro de tienda (simplificado para la pregunta). Tenga en cuenta que la cantidad de la tabla de registro siempre es 1 - un elemento, una línea de transacción.
TranID TranLine ItemId OrderID Dollars Quantity
------ -------- ------ ------- ------- --------
1 101 23845 23 2.99 1
1 102 23845 23 2.99 1
1 103 23845 23 2.99 1
1 104 23845 23 2.99 1
1 105 23845 23 2.99 1
que tienen que "igualar" estos datos a una tabla en un sistema de pedido especial donde los artículos se agrupan por cantidad. Tenga en cuenta que el sistema puede tener la misma ID de artículo en múltiples líneas (los componentes pedidos pueden ser diferentes incluso si el artículo es el mismo).
ItemId OrderID Order Line Dollars Quantity
------ ------- ---------- ------- --------
23845 23 1 8.97 3
23845 23 2 5.98 2
La única manera de que pueda coincidir con estos datos es mediante la identificación de la orden, Identificación del producto y cantidad en dólares.
Esencialmente necesito llegar al siguiente resultado.
ItemId OrderID Order Line Dollars Quantity Tran ID Tran Lines
------ ------- ---------- ------- -------- ------- ----------
23845 23 1 8.97 3 1 101;102;103
23845 23 2 5.98 2 1 104;105
no me importa especialmente si las líneas tran están ordenados de cualquier manera, lo único que importa es que el partido de los montos en dólares y que no "reutilización" una línea desde el registro en la informática el total en el orden especial. No necesito las líneas de tran en una tabla, esto es para informar y la granularidad nunca vuelve al nivel de línea de transacción de registro.
Mi pensamiento inicial era que puedo hacer esto con funciones analíticas para hacer una "mejor coincidencia" para identificar el primer conjunto de filas que coinciden con la cantidad en dólares y la cantidad en el sistema de pedidos, dándome un conjunto de resultados como :
TranID TranLine ItemId OrderID Dollars Quantity CumDollar CumQty
------ -------- ------ ------- ------- -------- -------- ------
1 101 23845 23 2.99 1 2.99 1
1 102 23845 23 2.99 1 5.98 2
1 103 23845 23 2.99 1 8.97 3
1 104 23845 23 2.99 1 11.96 4
1 105 23845 23 2.99 1 14.95 5
Hasta ahora todo bien. Pero entonces me intento agregar LISTAGG a mi consulta:
SELECT tranid, tranline, itemid, orderid, dollars, quantity,
SUM(dollars) OVER (partition by tranid, itemid, orderid order by tranline) cumdollar,
SUM(quantity) OVER (partition by tranid, itemid, orderid order by tranline) cumqty
LISTAGG (tranline) within group (order by tranid, itemid, orderid, tranline) OVER (partition by tranid, itemid, orderid)
FROM table
descubro que siempre devuelve un agg completa en lugar de un agg acumulativa:
TranID TranLine ItemId OrderID Dollars Quantity CumDollar CumQty ListAgg
------ -------- ------ ------- ------- -------- -------- ------ -------
1 101 23845 23 2.99 1 2.99 1 101;102;103;104;105
1 102 23845 23 2.99 1 5.98 2 101;102;103;104;105
1 103 23845 23 2.99 1 8.97 3 101;102;103;104;105
1 104 23845 23 2.99 1 11.96 4 101;102;103;104;105
1 105 23845 23 2.99 1 14.95 5 101;102;103;104;105
Así que esto no es útil.
Preferiría hacer esto en SQL si fuera posible. Soy consciente de que puedo hacer esto con los cursores & lógica de procedimiento.
¿Hay alguna forma de hacer ventanas con la función analítica LISTAGG, o quizás otra función analítica que pueda soportar esto?
Estoy en 11gR2.
+1 para una pregunta interesante muy bien escrita. – DCookie