Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008-Version von OVER(... Rows Unbounded Preceding)

Eine einfache Möglichkeit, dies zu tun, besteht darin, eine korrelierte Unterabfrage in CROSS APPLY zu verwenden .

Wenn Ihr Tisch mehr oder weniger groß ist, wäre Ihre nächste Frage, wie Sie ihn schnell machen können. Index auf PlaceB, Product, PickTime INCLUDE (Qty) sollte helfen. Aber wenn Ihre Tabelle wirklich groß ist, wäre Cursor besser.

WITH
ADVPICK
AS
(
    SELECT 'A' as PlaceA,PlaceB, case when PickTime = '00:00' then '07:00' else isnull(picktime,'12:00') end as picktime, cast(Product as int) as product, Prd_Description, -Qty AS Qty FROM t_pick_orders
    UNION ALL
    SELECT 'A' as PlaceA,PlaceB, '0', cast(Code as int) as product, NULL, Stock FROM t_pick_stock
)
,stock_post_order
AS
(
    SELECT
        *
    FROM
        ADVPICK AS Main
        CROSS APPLY
        (
            SELECT SUM(Sub.Qty) AS new_qty
            FROM ADVPICK AS Sub
            WHERE
                Sub.PlaceB = Main.PlaceB
                AND Sub.Product = Main.Product
                AND T.PickTime <= Main.PickTime
        ) AS A
)
SELECT
    *,
    CASE WHEN new_qty > qty THEN new_qty ELSE qty END AS order_shortfall
FROM
    stock_post_order
WHERE
    new_qty < 0
ORDER BY PlaceB, picktime, product;

Oh, und wenn (PlaceB, Product, PickTime) nicht eindeutig ist, erhalten Sie etwas andere Ergebnisse als bei der ursprünglichen Abfrage mit SUM() OVER . Wenn Sie genau dieselben Ergebnisse benötigen, müssen Sie eine zusätzliche Spalte verwenden (wie ID ), um die Bindungen aufzulösen.