Sql 插入行以填充序列
我试图在“年份”列中插入缺少年份的行。我们的想法是,从给定id的第一年开始,到2016年,每年填充一年和值。以下是我的当前状态:Sql 插入行以填充序列,sql,Sql,我试图在“年份”列中插入缺少年份的行。我们的想法是,从给定id的第一年开始,到2016年,每年填充一年和值。以下是我的当前状态: id year value a 2016 100 a 2015 90 a 2007 60 b 2016 120 b 2014 105 c 2015 110 c 2014 90 d 2016 150 这是我想要的状态: id year value a 2016 1
id year value
a 2016 100
a 2015 90
a 2007 60
b 2016 120
b 2014 105
c 2015 110
c 2014 90
d 2016 150
这是我想要的状态:
id year value
a 2016 100
a 2015 90
a 2014 60
a 2013 60
a 2012 60
a 2011 60
a 2010 60
a 2009 60
a 2008 60
a 2007 60
b 2016 120
b 2015 105
b 2014 105
c 2016 110
c 2015 110
c 2014 90
d 2016 150
因此,使用上一年的值填充缺少的年份。如何在Excel、SQL或VBA中实现这一点?我可以把它放到access数据库中完成这项工作。我现在唯一能想到的就是将我的当前表连接到SQL中的一个表中,然后重新填充空值。非常感谢您的帮助。谢谢
编辑:如何专门使用SQL进行编辑?可以使用下面所示的VBA暴力方法进行编辑。 如果你有任何问题,请告诉我
Dim ws As Worksheet
' assuming data is always sorted by id
Dim Row As Integer
Dim curID, prevID As String
Dim curYr, prevYr As Integer
Dim prevVal As Integer
Set ws = ThisWorkbook.ActiveSheet
Row = ws.Cells.SpecialCells(xlCellTypeLastCell).Row
' This does 2 things gets the prevID and makes sure previous line selects the actual last row
prevID = ""
Do
prevID = ws.Cells(Row, 1)
prevYr = ws.Cells(Row, 2)
prevVal = ws.Cells(Row, 3)
Row = Row - 1
Loop Until prevID <> "" Or Row = 2
While Row > 2
curID = ws.Cells(Row, 1)
curYr = ws.Cells(Row, 2)
' next id
If curID <> prevID Then
Row = Row + 1
For i = 2016 To (prevYr + 1) Step -1
ws.Rows(Row).Insert shift:=xlShiftDown
ws.Cells(Row, 1) = prevID
ws.Cells(Row, 2) = i
ws.Cells(Row, 3) = prevVal
Next i
Row = Row - 1
prevID = curID
prevYr = curYr
prevVal = ws.Cells(Row, 3)
' next year
ElseIf curYr - 1 = prevYr Then
prevID = curID
prevYr = curYr
prevVal = ws.Cells(Row, 3)
' in between
Else
Row = Row + 1
For i = (prevYr + 1) To (curYr - 1)
ws.Rows(Row).Insert shift:=xlShiftDown
ws.Cells(Row, 1) = prevID
ws.Cells(Row, 2) = i
ws.Cells(Row, 3) = prevVal
Next i
If prevYr = curYr Then
Row = Row - 1
End If
prevYr = curYr
End If
Row = Row - 1
Wend
Dim ws As工作表
'假设数据总是按id排序
将行设置为整数
Dim curID,prevID作为字符串
Dim curYr,prevYr为整数
Dim preval作为整数
设置ws=ThisWorkbook.ActiveSheet
行=ws.Cells.SpecialCells(xlCellTypeLastCell).Row
'这做了两件事获取prevID并确保前一行选择实际的最后一行
prevID=“”
做
prevID=ws.Cells(第1行)
prevYr=ws.Cells(第2行)
prevVal=ws.Cells(第3行)
行=行-1
循环直到prevID“”或Row=2
当行>2时
curID=ws.Cells(第1行)
curYr=ws.Cells(第2行)
“下一个id
如果居里·普雷维德
行=行+1
对于i=2016至(前一年+1)步骤-1
ws.Rows(Row).插入移位:=xlShiftDown
ws.Cells(行,1)=prevID
ws.Cells(第2行)=i
ws.Cells(第3行)=prevVal
接下来我
行=行-1
prevID=curID
prevYr=curYr
prevVal=ws.Cells(第3行)
"明年,
ElseIf curYr-1=上一个
prevID=curID
prevYr=curYr
prevVal=ws.Cells(第3行)
“中间
其他的
行=行+1
对于i=(前一年+1)到(当前年-1)
ws.Rows(Row).插入移位:=xlShiftDown
ws.Cells(行,1)=prevID
ws.Cells(第2行)=i
ws.Cells(第3行)=prevVal
接下来我
如果prevYr=curYr,则
行=行-1
如果结束
prevYr=curYr
如果结束
行=行-1
温德
这可以通过下面所示的VBA暴力方法来完成。
如果你有任何问题,请告诉我
Dim ws As Worksheet
' assuming data is always sorted by id
Dim Row As Integer
Dim curID, prevID As String
Dim curYr, prevYr As Integer
Dim prevVal As Integer
Set ws = ThisWorkbook.ActiveSheet
Row = ws.Cells.SpecialCells(xlCellTypeLastCell).Row
' This does 2 things gets the prevID and makes sure previous line selects the actual last row
prevID = ""
Do
prevID = ws.Cells(Row, 1)
prevYr = ws.Cells(Row, 2)
prevVal = ws.Cells(Row, 3)
Row = Row - 1
Loop Until prevID <> "" Or Row = 2
While Row > 2
curID = ws.Cells(Row, 1)
curYr = ws.Cells(Row, 2)
' next id
If curID <> prevID Then
Row = Row + 1
For i = 2016 To (prevYr + 1) Step -1
ws.Rows(Row).Insert shift:=xlShiftDown
ws.Cells(Row, 1) = prevID
ws.Cells(Row, 2) = i
ws.Cells(Row, 3) = prevVal
Next i
Row = Row - 1
prevID = curID
prevYr = curYr
prevVal = ws.Cells(Row, 3)
' next year
ElseIf curYr - 1 = prevYr Then
prevID = curID
prevYr = curYr
prevVal = ws.Cells(Row, 3)
' in between
Else
Row = Row + 1
For i = (prevYr + 1) To (curYr - 1)
ws.Rows(Row).Insert shift:=xlShiftDown
ws.Cells(Row, 1) = prevID
ws.Cells(Row, 2) = i
ws.Cells(Row, 3) = prevVal
Next i
If prevYr = curYr Then
Row = Row - 1
End If
prevYr = curYr
End If
Row = Row - 1
Wend
Dim ws As工作表
'假设数据总是按id排序
将行设置为整数
Dim curID,prevID作为字符串
Dim curYr,prevYr为整数
Dim preval作为整数
设置ws=ThisWorkbook.ActiveSheet
行=ws.Cells.SpecialCells(xlCellTypeLastCell).Row
'这做了两件事获取prevID并确保前一行选择实际的最后一行
prevID=“”
做
prevID=ws.Cells(第1行)
prevYr=ws.Cells(第2行)
prevVal=ws.Cells(第3行)
行=行-1
循环直到prevID“”或Row=2
当行>2时
curID=ws.Cells(第1行)
curYr=ws.Cells(第2行)
“下一个id
如果居里·普雷维德
行=行+1
对于i=2016至(前一年+1)步骤-1
ws.Rows(Row).插入移位:=xlShiftDown
ws.Cells(行,1)=prevID
ws.Cells(第2行)=i
ws.Cells(第3行)=prevVal
接下来我
行=行-1
prevID=curID
prevYr=curYr
prevVal=ws.Cells(第3行)
"明年,
ElseIf curYr-1=上一个
prevID=curID
prevYr=curYr
prevVal=ws.Cells(第3行)
“中间
其他的
行=行+1
对于i=(前一年+1)到(当前年-1)
ws.Rows(Row).插入移位:=xlShiftDown
ws.Cells(行,1)=prevID
ws.Cells(第2行)=i
ws.Cells(第3行)=prevVal
接下来我
如果prevYr=curYr,则
行=行-1
如果结束
prevYr=curYr
如果结束
行=行-1
温德
截至2016年每年填充的值
从何时开始?并解释使用SQL实现这一目标的逻辑。如果你有一个快速的方法把这些数据输入数据库,然后这样做,那么我会走这条路。与快速SQL语句相比,VBA会有点痛苦。此外,您的示例数据显示a
的第一年是2015
,值90
,但您希望的结果显示a
的日期可以追溯到2007
,未解释的值60
。数据已更新。我错过了将a-2007-60置于当前状态。这更有意义吗@JNevill@TheGameiswar从第一年起,我就有了该id。所以对于id a,是2007年,b 2014年,c 1014年,d是2016年<代码>每年填充的值,直到2016年代码>从何时开始?并解释使用SQL实现这一目标的逻辑。如果你有一个快速的方法把这些数据输入数据库,然后这样做,那么我会走这条路。与快速SQL语句相比,VBA会有点痛苦。此外,您的示例数据显示a
的第一年是2015
,值90
,但您希望的结果显示a
的日期可以追溯到2007
,未解释的值60
。数据已更新。我错过了将a-2007-60置于当前状态。这更有意义吗@JNevill@TheGameiswar从第一年开始,我就有了这个id。所以id a是2007年,b是2014年,c是1014年,d是2016年