3

これはSQLで可能ですか?シンプルなコンセプトのようです。(SQL Server 2005を使用しています)

SQLテーブルのすべての行をループして、1つの行が65で、次の行が120に等しい場合は列mの値を比較し、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ループ値を別の列に挿入できますか。それは私が立ち往生しているところです。

4

1 に答える 1

5

これは楽しいものでした!これを行うためのより効率的な方法があるかもしれませんが、ループやカーソルを必要とせずに、単一のセットベースのステートメントでそれを行うことができます。

次のようなデータをモデル化するテーブルを想定します(i基本的には行番号です)。

CREATE TABLE MyTable (i int, M int)

自己結合を使用して行ii+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を使用して、将来使用するためにデータを別のテーブルに取得できます。

于 2012-07-10T20:28:17.863 に答える