2012-07-10 94 views
3

这是可能的SQL吗?这看起来像一个简单的概念。 (我正在使用SQL Server 2005)VBA(Excel)vs SQL - 比较两行中的值(循环)

循环遍历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 

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

-Andrea

回答

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将数据获取到另一个表中以供将来使用。

+0

谢谢。这个解决方案非常出色,我非常喜欢这种思维方式。它确实为我节省了大量的时间和循环。 :D(我一开始有麻烦,但是我把它分解了下来,然后点击了它。) – akwarywo 2012-07-11 12:55:37

+0

很高兴为你效劳,akwarywo,并且欢迎来到stackoverflow!如果您对答案感到满意,您可以将其标记为可以帮助任何人解决此问题。 – 2012-07-11 13:28:06

+0

我遇到了select into部分的问题。我只想选择计数(*)+1标签(即:Q)。我已经玩了我们一个小时了,我不断收到以下错误:无法绑定多部分标识符“data.i”。任何想法将不胜感激。我认为这个问题可能是由于加入。 – akwarywo 2012-07-16 15:59:20