Sql 连接两个相关的表

Sql 连接两个相关的表,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我有两张表:一张用于发票,另一张用于付款: 待定发票 tbl_付款 期望输出如下所示: PSUM IPRICE ----------- ------------ 312.00 1100.00 其中: PSUM是付款总额 IPRICE是该客户的总价之和 我尝试的查询是: select IsNull(sum(p.amt), 0) PSUM, IsNull(sum(i.total_price), 0) IPRICE from tbl_invoice i left joi

我有两张表:一张用于发票,另一张用于付款:

待定发票

tbl_付款

期望输出如下所示:

PSUM        IPRICE
----------- ------------
312.00      1100.00
其中:

PSUM
是付款总额

IPRICE
是该客户的总价之和

我尝试的查询是:

select 
IsNull(sum(p.amt), 0) PSUM,
IsNull(sum(i.total_price), 0) IPRICE
from tbl_invoice i
left join tbl_payment p
on i.invoice_id = p.invoice_id
    and i.client_id = p.client_id
where i.client_id = 5
group by i.invoice_id
order by i.invoice_id
但它给出了错误的输出:

PSUM        IPRICE
----------- ------------
312.00      400.00
0.00        1000.00

看起来你想要这个。这将给出
金额
总价
的总和,不进行分组。您的版本按
invoice\u id
进行分组,这是区别:

select 
  IsNull(sum(p.amt), 0) PSUM,
  IsNull(sum(distinct i.total_price), 0) IPRICE
from tbl_invoice i
left join tbl_payment p
  on i.invoice_id = p.invoice_id
  and i.client_id = p.client_id
where i.client_id = 5

另一种编写方法是使用子查询:

select 
  IsNull(sum(p.amt), 0) PSUM,
  IsNull(sum(i.total_price), 0) IPRICE
from
(
  select sum(total_price) total_price, invoice_id, client_id
  from tbl_invoice
  group by invoice_id, client_id
) i
left join
(
  select sum(amt) amt, invoice_id, client_id 
  from tbl_payment
  group by invoice_id, client_id
) p
  on i.invoice_id = p.invoice_id
  and i.client_id = p.client_id
where i.client_id = 5

两者产生相同的结果:

| PSUM | IPRICE |
-----------------
|  312 |   1100 |

是否要按发票id对结果进行分组?或者每个客户只有一张记录(不管客户有多少张发票)?你太棒了:)@Bluefeet哪一张更方便。?@VishalSuthar他们的工作原理相同,这取决于你的喜好。