Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Odpowiednik LITAGG z klauzulą ​​okienkową

Jedynym sposobem, jaki przychodzi mi na myśl, aby to osiągnąć, jest skorelowane podzapytanie:

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;

Zdaję sobie sprawę, że nie daje to dokładnych wyników, o które prosiłeś, ale mam nadzieję, że wystarczy, aby przezwyciężyć problem skumulowanej LISTAGG i pomóc Ci przejść dalej.

Skonfigurowałem SQL Fiddle aby zademonstrować rozwiązanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Boot Actuator/punkt końcowy kondycji nie wyświetla informacji o bazie danych ani systemie plików

  2. Jak dodać atrybut do xml zawartego w CLOB w bazie danych Oracle?

  3. Kombinacje z pojedynczej tabeli pogrupowane według wartości kolumny

  4. jak wybrać listę 10 000 unikalnych identyfikatorów z dual w Oracle SQL

  5. Wielkie litery w nazwach dni i miesięcy podczas formatowania dat w Oracle