sql - 在 Firebird 中使用多个表的连接避免重复值

标签 sql firebird firebird2.5

我有3张 table

付款

<表类=“s-表”> <标题> 付款ID 日期 金额 <正文> 1 2021 年之前 500 2 2021 年 9 月 1200 3 2021 年 10 月 600

现金支付

<表类=“s-表”> <标题> 付款ID 金额 <正文> 1 500 2 400 3 200

信用卡付款

<表类=“s-表”> <标题> 付款ID 金额 信用卡 <正文> 2 450 签证 2 350 主持人 3 400 签证

我需要获取 PaymentID、日期、现金支付金额和信用卡支付金额,但通过以下查询,我得到了重复项。

请注意,我可以在一次付款中使用两张不同的信用卡,但我也可以在一次付款中使用两张不同的“现金付款”。

查询:

select
PA.DATE AS PaymntDate,
PA.PaymntID AS PaymntID,
CP.amount AS CashAmount,
CCP.amount AS CreditAmount,

from Payments PA
    LEFT join CashPayments CP on PA.PaymntID = CP.PaymntID
    LEFT join CreditCardPayments CCP on PA.PaymntID = CCP.PaymntID

我得到以下结果:

结果

<表类=“s-表”> <标题> 付款ID 付款日期 现金金额 信用金额 <正文> 1 2021 年之前 500 空 2 2021 年 9 月 400 450 2 2021 年 9 月 400 350 3 2021 年 10 月 200 400

所以在这种情况下,paymntid 2中的现金支付是重复的。我需要的是下表:

结果

<表类=“s-表”> <标题> 付款ID 付款日期 现金金额 信用金额 <正文> 1 2021 年之前 500 空 2 2021 年 9 月 400 800 3 2021 年 10 月 200 400

最佳答案

您需要在加入之前聚合每个 ID 的值。最简洁的方法可能是使用 CTE,然后将每个表外部连接到您的付款表,如下所示:

with cp as (
  select paymentId, Sum(Amount) Amount
  from CashPayments
  group by PaymentId
), ccp as (
  select paymentId, Sum(Amount) QAmount
  from CreditCardPayments
  group by PaymentId 
)
select p.PaymentId, p.Date,
  Coalesce(cp.Amount,0) CashAmount,
  Coalesce(ccp.Amount,0) CreditAmount
from Payments p
left join cp on cp.PaymentId = p.PaymentId
left join ccp on ccp.PaymentId = p.PaymentId

关于sql - 在 Firebird 中使用多个表的连接避免重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70507006/

相关文章:

php - SQL 求和并从第二个查询中添加两列

sql - 查询仅返回具有有效电子邮件的行并仅输出电子邮件

mysql - where 子句中的复杂 sql 查询

firebird - 在 FirebirdSql 中,如何从过程返回异常消息

sql - 返回根据字段值重复的记录

mysql - 数据库设计,列数可变

firebird - 如何在 Firebird 中执行返回结果集的过程

php - 如何从 Mysql 访问 firebird?

sql - Firebird SQL 中列的绝对最大值比较

firebird - 插入查询中的数字溢出