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

Wersja programu SQL Server 2008 OVER (... Wiersze bez ograniczeń poprzedzające)

Prostym sposobem na to jest użycie skorelowanego podzapytania w CROSS APPLY .

Jeśli twój stół jest mniej lub bardziej duży, następnym pytaniem będzie, jak zrobić to szybko. Indeksuj PlaceB, Product, PickTime INCLUDE (Qty) powinno pomóc. Ale jeśli twoja tabela jest naprawdę duża, kursor byłby lepszy.

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;

Aha, a jeśli (PlaceB, Product, PickTime) nie jest unikalny, uzyskasz nieco inne wyniki niż oryginalne zapytanie za pomocą SUM() OVER . Jeśli potrzebujesz dokładnie takich samych wyników, musisz użyć dodatkowej kolumny (np. ID ), aby rozwiązać więzy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niszczenie XML z planów wykonania

  2. Zmień CTE SELECT na funkcję wartości tabeli zdefiniowanej przez użytkownika

  3. Dopasowywanie danych z trzech tabel w SQL Server 2008

  4. Jak stworzyć prawdziwą relację jeden do jednego w SQL Server

  5. Zmień typ kolumny z liczbami z varchar na int