Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Porównuje całkowite zamówienia godzinowe i usuwa aktualne zapasy?

Nie mam pod ręką serwera SQL Server, a SQLFiddle ostatnio nie gra dobrze ze mną, więc nie zostało to przetestowane, ale logika powinna działać...

WITH
    stock_changes
AS
(
    SELECT Supplier, Destination, Req_Time, Prd_Code, Prd_Description, -Qty AS Qty FROM orders
    UNION ALL
    SELECT Supplier, NULL, '00:00', Prd_Code, Prd_Desc, Stock FROM stock
),
    stock_post_order
AS
(
    SELECT
        *,
        SUM(Qty) OVER (PARTITION BY Supplier, Prd_Code
                           ORDER BY Req_Time
                               ROWS UNBOUNDED PRECEDING
                      )
                         AS new_qty
   FROM
       stock_changes
)
SELECT
    *,
    CASE WHEN new_qty > qty THEN new_qty ELSE qty END   AS order_shortfall
FROM
    stock_post_order
WHERE
    new_qty < 0

Najpierw odwróć ilości zamówień na ujemne, tak aby były to ilości, o które zmienią się poziomy zapasów.

Następnie połącz poziomy zapasów z zamówieniami, z wymaganym czasem 0 (aby było trochę jak zamówienie, które dostarcza zapasy, a nie gromadzi zapasy i ma pierwszeństwo przed wszystkimi innymi zamówieniami) .

Następnie oblicz, jaka jest całkowita pozostała ilość produktu po zamówieniu; sumując wszystkie poprzednie wiersze (w kolejności czasowej) dla tego produktu. (Przekazywanie Stock - Order1 - Order2, etc, etc )

Następnie wybierz wiersze, w których nowy poziom zapasów spadł.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz XML bez rzutowania typu na ciąg

  2. Zaktualizuj rekord Top 1 na serwerze tabeli sql

  3. SQL do przeanalizowania ciągu klucz-wartość

  4. Porównanie cen produktów w sql

  5. Zaimportuj plik CSV do SQL Server za pomocą SqlBulkCopy