Cách duy nhất tôi có thể nghĩ ra để đạt được điều này là sử dụng một truy vấn con tương quan:
WITH CTE AS
( SELECT TranID,
TranLine,
ItemID,
OrderID,
Dollars,
Quantity,
SUM(dollars) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumDollar,
SUM(Quantity) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumQuantity
FROM T
)
SELECT TranID,
TranLine,
ItemID,
OrderID,
Dollars,
Quantity,
CumDollar,
CumQuantity,
( SELECT LISTAGG(Tranline, ';') WITHIN GROUP(ORDER BY CumQuantity)
FROM CTE T2
WHERE T1.CumQuantity >= T2.CumQuantity
AND T1.ItemID = T2.ItemID
AND T1.OrderID = T2.OrderID
AND T1.TranID = T2.TranID
GROUP BY tranid, itemid, orderid
) AS ListAgg
FROM CTE T1;
Tôi nhận thấy rằng điều này không cung cấp kết quả chính xác mà bạn yêu cầu, nhưng hy vọng nó đủ để khắc phục sự cố LISTAGG tích lũy và đưa bạn đi trên con đường của mình.
Tôi đã thiết lập SQL Fiddle để chứng minh giải pháp.