akw*_*ywo 3 sql excel vba for-loop sql-server-2005
这在SQL中可行吗?这似乎是一个简单的概念.(我正在使用SQL Server 2005)
循环遍历我的SQL表中的所有行 - (这是我的vba excel脚本,但裸露在我身边)比较列m中的值,如果一行= 65而下一行等于120增加j,并在另一列(列中)打印该值q)
Sub InsertProductionCycle()
Dim LR As Long
Dim j As Integer
j = 1
LR = Range("G" & Rows.Count).End(xlUp).Row
For i = 1 To LR Step 1
Cells(i, "Q").Value = j
If Cells(i, "M").Value = 65 And Cells(i + 1, "M").Value = 190 Then
j = j + 1
End If
Next i
End Sub
Run Code Online (Sandbox Code Playgroud)
来自SQL专家的任何想法?我可以在SQL中执行此操作吗?我对此的想法是:可能循环有点延伸,(我可以在sql作业中运行),但是你可以比较行并在另一列中插入j循环值.那就是我被困住的地方.
-Andrea
这是一个有趣的!可能有一种更有效的方法来执行此操作,但您可以在单个基于集的语句中执行此操作,而无需循环或游标.
假设一个表格对您的数据进行建模,看起来像这样(i
基本上是您的行号):
CREATE TABLE MyTable (i int, M int)
Run Code Online (Sandbox Code Playgroud)
我使用自联接来匹配i
行和i+1
行,并用a COUNT
来计算Q
列.
;WITH data AS (
SELECT a.i, a.M, b.M as NextM
, CASE WHEN a.M = 65 AND b.M = 190 THEN 1 ELSE 0 END AS shouldIncreaseQ
FROM MyTable a
LEFT OUTER JOIN MyTable b
ON a.i + 1 = b.i
)
SELECT data.M, data.NextM
, (SELECT COUNT(*) + 1 FROM data AS ref
WHERE ref.shouldIncreaseQ = 1 AND ref.i <= data.i) as Q
FROM data
Run Code Online (Sandbox Code Playgroud)
如果需要,可以使用SELECT INTO将数据放入另一个表中以供将来使用.