2012-12-17 69 views
0

我有两个表:一个用于发票和其他为他们支付:加入两个相关的表

tbl_Invoice

Invoice

tbl_payment

Payment

的愿望输出如下:

PSUM  IPRICE 
----------- ------------ 
312.00  1100.00 

其中:

PSUM是付款的总和。

IPRICE是客户端的TOTAL_PRICE的总和。

查询我想的是:

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 
+0

是否希望将结果按invoice_id分组?或者每个客户只有一个记录(不管客户有多少发票)? –

回答

1

好像你想要这个。这给出了amttotal_price的总和,没有分组。由invoice_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 

SQL Fiddle with Demo

你可以写这样的另一种方法是使用子查询:

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 

SQL Fiddle with Demo

两者产生相同的结果:

| PSUM | IPRICE | 
----------------- 
| 312 | 1100 | 
+0

你真棒..:)@ bluefeet –

+0

哪一个更方便。 –

+1

@VishalSuthar他们都是一样的,这取决于你的喜好。 – Taryn