sql >> Database >  >> RDS >> Oracle

LISTAGG-equivalent met vensterclausule

De enige manier die ik kan bedenken om dit te bereiken is met een gecorreleerde subquery:

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;

Ik realiseer me dat dit niet de exacte output geeft waar je om vroeg, maar hopelijk is het genoeg om het probleem van de cumulatieve LISTAGG op te lossen en je op weg te helpen.

Ik heb een SQL Fiddle ingesteld om de oplossing te demonstreren.



  1. Probleem met cyrillische tekens in vriendelijke url

  2. Top 5 MySQL-bewakingstools

  3. pijplijnfunctie met cursorparameter oracle

  4. Hoe meerdere rijen te selecteren op basis van hun samengestelde primaire sleutels in JOOQ?