【问题标题】:VBA (Excel) vs SQL - Comparing values in two rows (loop)VBA(Excel)与 SQL - 比较两行中的值(循环)
【发布时间】:2012-07-10 09:10:21
【问题描述】:

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

遍历我的 SQL 表中的所有行 如果一行 =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 循环值插入另一列。这就是我卡住的地方。

【问题讨论】:

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


    【解决方案1】:

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

    假设一个表格对您的数据进行建模,看起来像这样(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 将数据放入另一个表中以供将来使用。

    【讨论】:

    • 谢谢。这个解决方案很棒,我非常喜欢这种思维方式。它确实为我节省了很多时间来玩循环。 :D(起初我遇到了麻烦,但我把它弄坏了,然后它就为我点击了。)
    • 很高兴它对你有用,akwarywo,欢迎来到 stackoverflow!如果您对答案感到满意,可以将其标记为已接受,以帮助其他遇到此问题的人。
    • 我在选择部分时遇到问题。我只想选择计数(*)+ 1 个标签(即:Q)。我已经玩了一个小时了,我不断收到以下错误:无法绑定多部分标识符“data.i”。任何想法将不胜感激。我认为问题可能是由于加入。
    • 对不起,我发现了我的问题,我用另一个 with 语句只选择了 Q。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多