sql >> Database teknologi >  >> RDS >> Oracle

LISTAGG tilsvarende med vinduesklausul

Den eneste måde, jeg kan finde på at opnå dette, er med en korreleret underforespørgsel:

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;

Jeg er klar over, at dette ikke giver det nøjagtige output, du bad om, men forhåbentlig er det nok til at overvinde problemet med den kumulative LISTAGG og få dig på vej.

Jeg har konfigureret en SQL Fiddle for at demonstrere løsningen.



  1. SQLSTATE[HY000] [2002] Et forbindelsesforsøg mislykkedes.. - Ved forsøg på at oprette forbindelse fra lokal til fjernserver

  2. Hvad er den korrekte syntaks til partitionering i SQL

  3. Hvordan gemmer man en data med varierende komma i karakter, der passerer gennem en trigger?

  4. PHP- indsættelse af binære data i mysql ved hjælp af forberedte sætninger