sql - उपरोक्त पंक्ति एसक्यूएल के आधार पर गणना




sql-server sql-server-2008-r2 (4)

मैं यह जानना चाहता हूं कि पिछले महीने चालान का मूल्य क्या था, और इसे उसी मूल्य पर मौजूदा मान के रूप में रखा गया था।

मैं SQL सर्वर का उपयोग कर रहा हूँ। Microsoft SQL Server 2008 R2 (SP2)

मैंने सीटीई का उपयोग करके अपनी किस्मत की कोशिश की है और सभी तरह के अजीब जुड़ते हैं, लेकिन मेरा उत्पादन कभी भी सही नहीं होता। क्या कोई मुझे सही दिशा में बता सकता है?

उदाहरण तालिका:

invoice_month   value
--------------------------
    201510      337265.386
    201511      335466.456
    201512      338646.500
    201601      333440.380
    201602      330731.208
    201603      339299.752
    201604      340878.168
    201605      359585.382
    201606      339616.430
    201607      316457.486
    201608      308009.976
    201609      232196.268
    201610      894839.180
    201611      232196.268
    201612      232196.268
    201701      232196.268
    201702      232196.268
    201703      232196.268

अपेक्षित उत्पादन होगा:

invoice_month   value,         prevValue
--------------------------------------------
    201510      337265.386,    NULL
    201511      335466.456,    337265.386
    201512      338646.500,    335466.456
    201601      333440.380,    333440.380
    201602      330731.208,    333440.380
    201603      339299.752,    330731.208
    201604      340878.168,    339299.752
    201605      359585.382,    340878.168
    201606      339616.430,    359585.382
    201607      316457.486,    339616.430
    201608      308009.976,    316457.486
    201609      232196.268,    308009.976
    201610      894839.180,    232196.268
    201611      232196.268,    894839.180
    201612      232196.268,    232196.268
    201701      232196.268,    232196.268
    201702      232196.268,    232196.268
    201703      232196.268,    232196.268

Answers

SELECT *
FROM   (SELECT TOP 1 invoice_month,
                     value,
                     NULL AS [Previous value]
        FROM   Invoice
        ORDER  BY invoice_month ASC) T
UNION
SELECT I.invoice_month,
       I.value,
       I1.value AS [Previous value]
FROM   Invoice I
       INNER JOIN Invoice I1
               ON I.invoice_month - 1 = I1.invoice_month

2012 के पूर्व संस्करणों के लिए:

;with cte
 as
(select invoice_month,value,
row_number() over (order by invoice_month) as rn
from  #temp  )
select c1.*,c2.value
from cte c1
left join
cte c2
on c1.rn=c2.rn+1

SQL सर्वर 2012+ में, आप lag() प्रयोग करेंगे:

select t.invoice_month, t.value,
       lag(t.value) over (order by t.invoice_month) as prev_value
from t;

यह एएनएसआई मानक फ़ंक्शन है I SQL सर्वर के पिछले संस्करणों में, वैकल्पिक विधियां हैं


उपयोग:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 




sql sql-server sql-server-2008-r2