Sky*_*ive 4 sql t-sql sql-server
目前,我有这个记录
发票清单表
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
Run Code Online (Sandbox Code Playgroud)
InvoiceID自动递增.我想要做的是IssuedDate通过增量更新前一行的日期.我想像这样更新它
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
Run Code Online (Sandbox Code Playgroud)
目前我有这个选择声明,并且运作良好.但我怎么用这个来更新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
Run Code Online (Sandbox Code Playgroud)
更新1
我对第一篇文章感到非常抱歉,因为给我的指示不正确.日期不应增加,因为我们不允许更改表中的记录,除非我们只能按升序重新排列日期.所以它应该是.
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
Run Code Online (Sandbox Code Playgroud)
如果你知道序列中的第一个日期,你可以简单地添加RowNumber:
; 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)
Run Code Online (Sandbox Code Playgroud)
更新:
; 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))
Run Code Online (Sandbox Code Playgroud)
; 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |