sql >> データベース >  >> RDS >> Oracle

ウィンドウ句と同等のLISTAGG

    これを達成するために私が考えることができる唯一の方法は、相関サブクエリを使用することです:

    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;
    

    これはあなたが求めていた正確な出力を提供しないことを私は理解していますが、うまくいけば、累積的なLISTAGGの問題を克服し、あなたを道に導くのに十分です。

    SQLFiddle を設定しました 解決策を示すため。



    1. 5日より古いすべての行を削除する

    2. cURLを使用してWebサイトから特定のデータをフェッチし、phpを使用してデータベースに保存する方法

    3. 警告:mysql_fetch_array()は、パラメーター1がリソースであると想定しています[...]

    4. 各行のMYSQLPHP更新データ