Sql server 2008 联接3表时,SUM返回错误值-MS SQL

Sql server 2008 联接3表时,SUM返回错误值-MS SQL,sql-server-2008,Sql Server 2008,我有3个表需要加入,即表发票,项目和付款。表项目和付款将根据发票id加入表发票 现在,我需要按发票日期获取销售、成本后销售和付款的总和 这就是我的问题 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 paymen

我有3个表需要加入,即表发票项目付款。表项目和付款将根据发票id加入表发票

现在,我需要按发票日期获取销售、成本后销售和付款的总和

这就是我的问题

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
totalSales  salesAfterCost
37.770000   33.770000
并查询销售

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';
结果:

paymentReceived
155.7000
totalSales  salesAfterCost
37.770000   33.770000
我怎样才能解决这件事

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'
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'

@不信的达米恩是对的。但是,如果你可以将付款与发票上的特定项目合并,也可以解决这个问题。@davmos-考虑到付款乘以4,销售乘以2,我认为发票和付款之间不存在1-1对应关系。当然@Damien_不信者,但我没有这么说。我只是暗示了发票上的项目和付款之间可能存在1-1关系。也许不可能,但我想我会把它放进混音中来帮助理解。@Damien_不信者是对的。但是,如果你可以将付款与发票上的特定项目合并,也可以解决这个问题。@davmos-考虑到付款乘以4,销售乘以2,我认为发票和付款之间不存在1-1对应关系。当然@Damien_不信者,但我没有这么说。我只是暗示了发票上的项目和付款之间可能存在1-1关系。可能不可能,但我想我会把它加入到混合中来帮助理解。