Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Version SQL Server 2008 de OVER(... Rows Unbounded Preceding)

Une façon simple de le faire est d'utiliser une sous-requête corrélée dans CROSS APPLY .

Si votre table est plus ou moins grande, votre prochaine question serait de savoir comment la rendre rapide. Index sur PlaceB, Product, PickTime INCLUDE (Qty) devrait aider. Mais, si votre table est vraiment grande, le curseur serait mieux.

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, et si (PlaceB, Product, PickTime) n'est pas unique, vous obtiendrez des résultats quelque peu différents de la requête d'origine avec SUM() OVER . Si vous avez besoin d'exactement les mêmes résultats, vous devez utiliser une colonne supplémentaire (comme ID ) pour résoudre les égalités.