Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入行以填充序列_Sql - Fatal编程技术网

Sql 插入行以填充序列

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的第一年开始,到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    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年