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

SQL内部查询试图在where子句中使用别名,sql,amazon-athena,Sql,Amazon Athena,我有一个由两个表组成的联接,它们表示合同已完成的付款列表 该样本数据由5份合同组成,其中一些合同拖欠付款,因此考虑到当前日期为:2021年5月9日,我想获得过去7天内未付款的合同列表 例如,合同121、300、321和400在过去7天内进行了付款,因此它们的任何记录都不应出现在最终查询中。然而: 合同321尽管在过去7天内进行了付款,但他们有一笔冲销,这是他们在过去7天内进行的信贷总额,这相当于0笔付款,因此我希望此合同出现在我的最终查询中 合同121,我不想出现在最终结果中,因为尽管有冲销

我有一个由两个表组成的联接,它们表示合同已完成的付款列表

该样本数据由5份合同组成,其中一些合同拖欠付款,因此考虑到当前日期为:2021年5月9日,我想获得过去7天内未付款的合同列表

例如,合同121、300、321和400在过去7天内进行了付款,因此它们的任何记录都不应出现在最终查询中。然而:

  • 合同321尽管在过去7天内进行了付款,但他们有一笔冲销,这是他们在过去7天内进行的信贷总额,这相当于0笔付款,因此我希望此合同出现在我的最终查询中
  • 合同121,我不想出现在最终结果中,因为尽管有冲销,但总共有20个信用(100个信用-80个冲销)
  • 合同400我想出现在我的结果中,因为其中一行的代码名为Special Delete
在fiddle中,我能够创建一个查询来过滤过去7天内所有付款记录,但我需要帮助添加额外的过滤:

  • 如果出现任何合同,如果贷记和借记的总和为0,则该合同应出现在最终结果中(如同未发送付款一样),这将是合同321的情况
  • 如果积分为正值,但其中一行的代码名为“SpecialDelete”,则在最终结果中显示它(合同400就是这种情况)
  • 贷记总额大于0的借方总额
我将在AWS Athena中使用此查询

我猜我需要强调的部分是(其中Payments.contracted不在…):


您的猜测是正确的,以下是您需要的(如果我没有遗漏任何内容):


如果样本数据在问题中,您的问题会更清楚。用提琴来理解一个问题的细节是相当愚蠢的。@godon,我尊重你的意见,但强烈反对,用提琴你好,让问题更清楚,帮我检查下面的答案,拥有样本数据将使文章变得冗长,并可能失去那些知道并可能提供帮助的人的兴趣
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;