如何解决SQL 内部查询试图在 where 子句中使用别名
我有 2 个表的连接,它们代表合同已完成的付款列表。
Sample Query: (https://www.db-fiddle.com/f/iXGxgDTopsBBgXGUJsXpa/13)
该样本数据由 5 个合约组成,其中一些在付款方面落后,因此我想获取过去 7 天内未付款的合约列表,考虑当前日期:5 月 9 日2021 年。
例如,合同 121、300、321 和 400 已在过去 7 天内付款,因此它们的任何记录不应出现在最终查询中。但是:
- 合同 321 尽管在过去 7 天内支付了一笔款项,但他们在过去 7 天内进行了总信用额的撤销,这相当于 0 笔付款,所以我希望这份合同出现在我的最终查询。
- 合同 121,我不想出现在最终结果中,因为尽管发生了逆转,但总积分为 20(100 积分 - 80 逆转)
- 合同 400 我想出现在我的结果中,因为其中一行的代号为“特殊删除”。
在小提琴中,我能够创建过滤过去 7 天内有付款的所有记录的查询,但我需要帮助添加额外的过滤:
- 如果贷方和借方的总和为 0 时出现任何合约,那么它应该出现在最终结果中(就像没有付款一样),这就是合约 321 的情况。
- 如果积分为正,但其中一行的代号为“SpecialDelete”,则将其显示在最终结果中(合同 400 就是这种情况)
- 总借方与大于 0 的总贷方
我将在 AWS Athena 中使用此查询
我猜我需要修改的部分是(WHERE Payments.ContractID NOT IN ....):
SELECT PaymentID,Payments.ContractID,PaymentDate,Credit,Debit,Code,CodeName,amount,city
FROM Payments
LEFT JOIN Info ON Info.ContractID = Payments.ContractID
WHERE Payments.ContractID NOT IN (
SELECT Payments.ContractID
FROM Payments
WHERE PaymentDate >= '20210501'
)
ORDER BY PaymentDate DESC
;
解决方法
你猜对了,这是你需要的(如果我没有遗漏任何东西):
SELECT p.ContractID,PaymentDate,Credit,Debit,Code,CodeName,amount,city
FROM Payments p
LEFT JOIN Info ON Info.ContractID = p.ContractID
WHERE p.ContractID NOT IN (
SELECT p2.ContractID
FROM Payments p2
WHERE p2.PaymentDate >= '20210501'
group by p2.ContractID
having sum(p2.credit - p2.debit) > 0
) or codename = 'Special Delete'
ORDER BY PaymentDate DESC;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。