Currently, I have this records
InvoiceList Table
InvoiceID StoreCustomerID IssuedDate Amount IsPenalty EmployeeID
----------- --------------- ---------- ----------- ----------- -----------
1 13 2007-01-12 244 0 41
2 31 2007-04-05 81 0 34
3 23 2007-01-09 184 0 46
4 28 2007-11-21 231 0 17
5 36 2006-09-19 121 0 22
6 28 2006-10-24 240 0 17
7 15 2006-12-11 193 0 47
8 21 2007-01-15 172 0 4
InvoiceID
is auto-incremented. What I want to do is to update IssuedDate
by increment the date of the previous row. I want to update it like this
InvoiceID StoreCustomerID IssuedDate Amount IsPenalty EmployeeID
----------- --------------- ---------- ----------- ----------- -----------
1 13 2007-01-12 244 0 41
2 31 2007-01-13 81 0 34
3 23 2007-01-14 184 0 46
4 28 2007-01-15 231 0 17
5 36 2007-01-16 121 0 22
6 28 2007-01-17 240 0 17
7 15 2007-01-18 193 0 47
8 21 2007-01-19 172 0 4
Currently I have this select statement and is working well. But how can i used this to update the IssuedDate
?
WITH SequenceDate AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY IssuedDate) RowNumber
FROM Invoice
)
SELECT RowNumber, DATEADD(d, RowNumber - 1, b.IssuedDate)
FROM SequenceDate
ORDER BY RowNumber
UPDATE 1
I'm terribly sorry for the first post as the instruction given to me was not correct. The dates shouldn't be incremented since we are not allowed to alter the records in the table except that we can only rearrange the dates in ascending order. So it should be.
InvoiceID StoreCustomerID IssuedDate Amount IsPenalty EmployeeID
----------- --------------- ---------- ----------- ----------- -----------
1 13 2006-09-19 244 0 41
2 31 2006-10-24 81 0 34
3 23 2006-12-11 184 0 46
4 28 2007-01-09 231 0 17
5 36 2007-01-12 121 0 22
6 28 2007-01-15 240 0 17
7 15 2007-04-05 193 0 47
8 21 2007-11-21 172 0 4
If you know first date in the sequence you can simply add RowNumber to it:
; WITH SequenceDate AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY IssuedDate) RowNumber,
MIN(IssuedDate) over () FirstDate
FROM Invoice
)
UPDATE SequenceDate
SET IssuedDate = DATEADD(d, RowNumber - 1, FirstDate)
Here is Sql Fiddle with example.
UPDATE:
to match first question's output exactly:
; WITH SequenceDate AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY InvoiceID) RowNumber
FROM Invoice
)
UPDATE SequenceDate
SET IssuedDate = DATEADD(d, RowNumber - 1,
(select IssuedDate
from Invoice
where InvoiceID = 1))
And to rearange dates to follow InvoiceID:
; WITH SequenceDate AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY InvoiceID) RowNumber,
ROW_NUMBER() OVER (ORDER BY IssuedDate) DateNumber
FROM Invoice
)
UPDATE SequenceDate
SET IssuedDate = d.IssuedDate
from SequenceDate d
where SequenceDate.RowNumber = d.DateNumber
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With