2013-05-24 11 views
5

की गणना करने के लिए कार्य करने के लिए मुझे विंडोिंग फ़ंक्शंस के साथ कुछ मदद चाहिए।एसक्यूएल सर्वर 2012 रनिंग फ़ंक्शन रनिंग कुल

मैं हाल ही में एसक्यूएल 2012 विंडोिंग कार्यों के साथ खेल रहा हूं। मुझे पता है कि आप एक खिड़की के भीतर योग और एक खिड़की के भीतर चलने वाले कुल की गणना कर सकते हैं। लेकिन मैं सोच रहा था; क्या पिछले चल रहे कुल की गणना करना संभव है यानी चालू पंक्ति सहित नहीं चल रहा कुल? मुझे लगता है कि आपको ROW या RANGE तर्क का उपयोग करने की आवश्यकता होगी और मुझे पता है कि एक वर्तमान पंक्ति विकल्प है लेकिन मुझे एक वर्तमान पंक्ति की आवश्यकता होगी - I जो अमान्य वाक्यविन्यास है। ROW और RANGE तर्कों का मेरा ज्ञान सीमित है इसलिए किसी भी मदद की सराहना की जाएगी।

मुझे पता है कि इस समस्या के कई समाधान हैं, लेकिन मैं ROW, RANGE तर्कों को समझना चाहता हूं और मुझे लगता है कि समस्या इनके साथ क्रैक की जा सकती है। मैंने पिछले रनिंग कुल की गणना करने के लिए एक संभावित तरीका शामिल किया है, लेकिन मुझे आश्चर्य है कि कोई बेहतर तरीका है या नहीं।

USE AdventureWorks2012 

SELECT s.SalesOrderID 
    , s.SalesOrderDetailID 
    , s.OrderQty 
    , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal 
    , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID 
         ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal 
    -- Sudo code - I know this does not work 
    --, SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID 
    --     ORDER BY SalesOrderDetailID 
    --     ROWS BETWEEN UNBOUNDED PRECEDING 
    --         AND CURRENT ROW - 1) 
    -- AS SudoCodePreviousRunningTotal 
FROM Sales.SalesOrderDetail s 
WHERE SalesOrderID IN (43670, 43669, 43667, 43663) 
ORDER BY s.SalesOrderID 
    , s.SalesOrderDetailID 
    , s.OrderQty 

अग्रिम धन्यवाद

+1

कृपया दोनों [डाटाबेस प्रशासकों] पर नहीं पार पोस्ट करते हैं (http://dba.stackexchange.com/questions/42985/sql-windowing-function-to-create- एक रनिंग-कुल) और यहां सिवाय इसके कि अगर उत्तर प्रोग्रामर बनाम डीबीए परिप्रेक्ष्य से भिन्न हो। –

उत्तर

20

आप वर्तमान पंक्ति के मूल्य घटाना सकता है:

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID 
         ORDER BY SalesOrderDetailID) - s.OrderQty 

या syntax at MSDN और ypercube's answer के अनुसार:

<window frame preceding> ::= 
{ 
    UNBOUNDED PRECEDING 
    | <unsigned_value_specification> PRECEDING 
    | CURRENT ROW 
} 

->

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID 
         ORDER BY SalesOrderDetailID 
         ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) 
संबंधित मुद्दे