首页 > 解决方案 > 在表中搜索相反的值

问题描述

我最初是在 VBA 中开始这个项目的,但是,很快我就发现 VBA 效率低下,并试图将我的代码复制到 SQL 中。

我试图查看所有行并将所有具有相应负金额并具有相同帐户代码的金额组合在一起(理想情况下在数据/新表格的顶部)。

我的 SQL 知识目前不存在,因此欢迎任何建议或培训链接。也欢迎任何关于我如何在 SQL 中编写脚本的帮助

初始数据输入

数据在 excel 中,100k+ 行,A 列标记为 [Account Code],第 i 列标记为 [Amount]。

期望的输出

理想情况下,所有分组金额(与相应的负数分组,即 +1000 与金额为 -1000 的行分组)和相同的帐户代码位于数据顶部或单独的表中。

VBA 代码

'n = total rows
n = Range("A8").End(xlDown).Row

'l= total number of positives
l = Application.WorksheetFunction.CountIf(Range(Cells(8, 9), Cells(n, 9)), ">0") + 1

CurrentRow = CurrentRow + 1
For i = 8 To l
    For j = l + 1 To n
        If Range("i" & i) = -Range("i" & j) Then
            If Range("a" & i) = Range("a" & j) Then
                Worksheets("Ledger Extract").Range(i & ":" & i).Copy Worksheets("Sheet1").Range(CurrentRow & ":" & CurrentRow)

                CurrentRow = CurrentRow + 1

                Worksheets("Ledger Extract").Range(j & ":" & j).Copy Worksheets("Sheet1").Range("A" & CurrentRow)

                CurrentRow = CurrentRow + 1
            End If
        End If
    Next j
Next i

在此处输入图像描述

我的 SQL 进度

SELECT [Account Code], COUNT(*) Occurence, SUM([Amount]) TotalAmount
FROM Table
GROUP BY [Account Code]
HAVING COUNT(*) > 1

到目前为止,这设法整理了有多个帐户的所有事件,但并没有解决我只整理相反金额的查询。

标签: sqlsql-serverexcel

解决方案


要获取所有匹配的记录,您可以使用

SELECT      * 
FROM        Table T1
WHERE EXISTS
 ( SELECT * FROM Table AS T2
   WHERE t1.[Account Code] = T2.[Account Code]
   AND   t1.Amount = -t2.Amount
 ) 
 ORDER BY [Account Code], ABS(Amount)

要获取所有不匹配的记录,您可以使用以下查询。

SELECT      * 
FROM        Table T1
WHERE NOT EXISTS
 ( SELECT * FROM Table AS T2
   WHERE t1.[Account Code] = T2.[Account Code]
   AND   t1.Amount = -t2.Amount
 ) 
 ORDER BY [Account Code], ABS(Amount)

推荐阅读