ऐसा करने का एक सीधा-सीधा तरीका है CROSS APPLY
में एक सहसंबद्ध उप-क्वेरी का उपयोग करना ।
अगर आपकी टेबल कम या ज्यादा बड़ी है, तो आपका अगला सवाल होगा कि इसे फास्ट कैसे बनाया जाए। PlaceB, Product, PickTime INCLUDE (Qty)
. पर अनुक्रमणिका मदद करनी चाहिए। लेकिन, अगर आपकी टेबल वास्तव में बड़ी है, तो कर्सर बेहतर होगा।
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;
ओह, और अगर (PlaceB, Product, PickTime)
अद्वितीय नहीं है, आपको SUM() OVER
. के साथ मूल क्वेरी से कुछ भिन्न परिणाम मिलेंगे . यदि आपको बिल्कुल समान परिणामों की आवश्यकता है, तो आपको कुछ अतिरिक्त कॉलम (जैसे ID
.) का उपयोग करने की आवश्यकता है ) संबंधों को सुलझाने के लिए।