2012-07-10 34 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