sql - 在表中搜索相反的值
问题描述
我最初是在 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
到目前为止,这设法整理了有多个帐户的所有事件,但并没有解决我只整理相反金额的查询。
解决方案
要获取所有匹配的记录,您可以使用
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)
推荐阅读
- javascript - Fetch 被触发两次
- javascript - 我可以在反应中使用人脸识别 npm 包吗?
- c++ - 如何使用 emscripten embind 将 json 对象作为参数传递给 c++ 函数
- nsurlsession - 使用 crt 和 pem 进行身份验证挑战 NSURLAuthenticationMethodClientCertificate
- java - JPA/Hibernate:当列名不同时如何注释延迟提取?
- yarnpkg - 我们可以更改纱线审计功能以忽略特定漏洞吗?
- typescript - 如何在 Typescript 中声明一个具有现有接口的所有字段以及其他字段的变量
- mongodb - 制作 Bigchaindb 网络
- c++ - 继承的静态方法不使用新的重写静态属性
- sql - 根据 PostgreSQL 中的多个条件和交集更新多个列