2013-05-01 104 views
0

我有3个表需要加入即表发票项目支付。表项目支付将加入到表发票基于发票编号SUM返回错误的值时加入3表 - MS SQL

现在我需要得到SUM 销售,销售成本支付后按发票日期。

所以这是我的查询

SELECT SUM((I.price * qty) - (I.price * qty * discount)) as totalSales,SUM((I.price * qty) - (I.price * qty * discount)-costItem) as salesAfterCost, SUM(PAY.amount) as paymentReceived 
FROM tbl_inv B LEFT JOIN tbl_item I ON B.id = I.id_invoice 
LEFT JOIN tbl_payment PAY ON B.id = PAY.id_invoice 
WHERE B.dateInv = '2013-04-01' 
GROUP BY B.id,b.dateInv; 

并把结果返回这样

totalSales salesAfterCost paymentReceived 
75.540000 67.540000  622.8000 

但是,当我与此查询核实,以获取支付总额,它会与不同的价值回归。

SELECT SUM(PAY.amount) paymentReceived 
FROM tbl_inv B LEFT JOIN tbl_payment PAY ON B.id = PAY.id_invoice 
WHERE B.dateInv = '2013-04-01'; 

结果:

paymentReceived 
155.7000 

,查询销售

SELECT SUM((I.price * qty) - (I.price * qty * discount)) as totalSales,SUM((I.price * qty) - (I.price * qty * discount)-costItem) as salesAfterCost 
FROM tbl_inv B LEFT JOIN tbl_item I ON B.id = I.id_invoice 
WHERE B.dateInv = '2013-04-01'; 

结果:

totalSales salesAfterCost 
37.770000 33.770000 

我怎样才能解决这个事情?

+0

@Damien_The_Unbeliever是正确的。但是,如果您可以将付款加入发票上的特定项目,也可以解决。 – davmos 2013-05-01 07:17:49

+0

@davmos - 考虑到付款乘以4,销售额乘以2,我不认为发票和付款之间存在1-1对应关系。 – 2013-05-01 07:20:33

+0

当然@Damien_The_Unbeliever,但我没有这么说。我只是暗示了**发票上的项目**与付款之间的1-1关系的可能性。可能不可能,但我认为我会把它放到混合中来帮助理解。 – davmos 2013-05-01 07:28:25

回答

3

移动SUM() s转换的子查询 - 此刻,从支付每一行正在对每一行从发票匹配,造成了笛卡儿连接

SELECT I.totalSales,I.salesAfterCost, PAY.paymentReceived 
FROM tbl_inv B 
LEFT JOIN (
    select id_invoice,SUM((I.price * qty) - (I.price * qty * discount)) as totalSales, 
     SUM((I.price * qty) - (I.price * qty * discount)-costItem) as salesAfterCost 
    from tbl_item group by id_invoice) I 
     ON 
     B.id = I.id_invoice 
LEFT JOIN (
    select id_invoice,SUM(amount) as paymentReceived 
    from tbl_payment group by id_invoice) PAY 
     ON 
     B.id = PAY.id_invoice 
WHERE B.dateInv = '2013-04-01' 
+0

谢谢你的帮助,像冠军一样工作 – Chuki2 2013-05-01 15:15:57