VBA(Excel)vs SQL - 比较两行中的值(循环)

时间:2012-07-10 19:59:51

标签: sql excel sql-server-2005 vba for-loop

这在SQL中可行吗?这似乎是一个简单的概念。 (我正在使用SQL Server 2005)

循环遍历SQL表中的所有行 比较列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 

SQL专家的任何想法?我可以在SQL中执行此操作吗? 我对此的看法是:  也许循环有点拉伸(我可以在sql作业中运行),但是你可以比较行并在另一列中插入j循环值。那就是我被困住的地方。

1 个答案:

答案 0 :(得分:5)

这是一个有趣的!可能有一种更有效的方法来执行此操作,但您可以在单个基于集的语句中执行此操作,而无需循环或游标。

假设一个表格对您的数据进行建模,看起来像这样(i基本上就是您的行号):

CREATE TABLE MyTable (i int, M int)

我使用自我加入来匹配i行与i+1行,并使用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

如果需要,您可以使用SELECT INTO将数据放入另一个表中以供将来使用。