sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008-versie van OVER (... Onbegrensde rijen voorafgaand)

Een eenvoudige manier om dit te doen, is door een gecorreleerde subquery te gebruiken in CROSS APPLY .

Als uw tafel min of meer groot is, is uw volgende vraag hoe u deze snel kunt maken. Index op PlaceB, Product, PickTime INCLUDE (Qty) zou moeten helpen. Maar als je tafel erg groot is, zou de cursor beter zijn.

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, en als (PlaceB, Product, PickTime) is niet uniek, je krijgt iets andere resultaten dan de oorspronkelijke zoekopdracht met SUM() OVER . Als je precies dezelfde resultaten nodig hebt, moet je een extra kolom gebruiken (zoals ID ) om de banden op te lossen.




  1. mysql_connect fout 500

  2. Hoe kan ik mijn ad-hoc SQL testen met parameters in het Postgres-queryvenster?

  3. enkele invoegquery om meerdere rijen in één kolom in te voegen

  4. Gegevens ontleden en vergelijken met Coldfusion &MySQL