Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

LISTAGG setara dengan klausa windowing

Satu-satunya cara yang dapat saya pikirkan untuk mencapai ini adalah dengan subquery yang berkorelasi:

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;

Saya menyadari ini tidak memberikan hasil persis seperti yang Anda minta, tetapi mudah-mudahan ini cukup untuk mengatasi masalah LISTAGG kumulatif dan membantu Anda melanjutkan.

Saya telah menyiapkan SQL Fiddle untuk mendemonstrasikan solusinya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle tidak menghapus kursor setelah menutup set hasil

  2. Labirin Penyetelan Kinerja

  3. Oracle mendapatkan baris yang sama persis dengan daftar nilai

  4. cara meneruskan variabel dari skrip shell ke sqlplus

  5. flyway clean tidak menjatuhkan pekerjaan atau program penjadwal