微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL 内部查询试图在 where 子句中使用别名

如何解决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 举报,一经查实,本站将立刻删除。