SQL Server:在SQL Server查询中使用Distinct关键字获取不正确的数据

时间:2011-02-20 10:35:32

标签: sql sql-server database sql-server-2005 sql-server-2008

我有一个包含以下列的表。

ID   Amount
1      300
2      400
3      500
1      300 
2      400
3      500

对应ID,有数量列。

我希望将我使用distinct关键字的金额列相加,以便总和为1200而不是2400.

但这是捕获;

说出ID是否

ID   Amount
1      300
2      400
3      500
4      400 

,值为300,400,500和400.因此总数应为1600,但因为我在case1中使用了DISTINCT关键字,所以总数达到1200.

我应该如何编写我的sql查询,以便两种情况都满足?

仅供参考,我的SQL查询不只是求和,而且还涉及与其他表的关系,然后使用一些公式,我提出了数据。

由于

更新:SQL QUERY ADDED

Select distinct
  (
    (
      select sum( fees)
      from (
        select distinct billdetail.fees
        from billdetail
          join payment on billdetail.billdetailid = payment.billdetailid
        where billdetail.patientid=@patientid
      ) as temp
    )
    -
    (
      Select SUM (Payment.PlanPaid)
           + SUM (Payment.PatPaid)
           + SUM (Payment.WriteOff1)
           + SUM (Payment.WriteOff2)
      from  BillDetail
        left outer join Payment on BillDetail.BillDetailID = Payment.BillDetailID
      where BillDetail.PatientID = @patientid
    )
  )
from BillDetail
where PatientID = @patientid

3 个答案:

答案 0 :(得分:2)

使用您的初始示例,您可以正确计算总和,如果在选择不同的行时,您使用相应的ID提供金额值。这样,您将选择具有相同总和但不完全重复的行。

SELECT SUM(Amount)
FROM (
  SELECT DISTINCT
    ID,
    Amount
  FROM YourTable
) s

在添加的查询中,我认为您需要修改此子选择:

select distinct billdetail.fees
from billdetail
  join payment on billdetail.billdetailid = payment.billdetailid
where billdetail.patientid=@patientid
像这样:

select distinct billdetail.ID, billdetail.fees
from billdetail
  join payment on billdetail.billdetailid = payment.billdetailid
where billdetail.patientid=@patientid

也就是说,通过添加billdetail.ID,您提供了必要的区分级别,因此得到的总和应该是正确的。

答案 1 :(得分:0)

请尝试正确格式化查询以便于理解。

Select distinct ((
    select sum( fees) 
    from (
            select distinct  billdetail.fees 
            from billdetail 
            join payment on billdetail.billdetailid = payment.billdetailid 
            where billdetail.patientid=@patientid) 
        as temp)
       -
    (Select SUM (Payment.PlanPaid) + SUM (Payment.PatPaid) + SUM (Payment.WriteOff1) + SUM (Payment.WriteOff2) 
    from  BillDetail 
    left outer join Payment on BillDetail.BillDetailID = Payment.BillDetailID 
    where BillDetail.PatientID = @patientid)
) 
from BillDetail
where PatientID = @patientid

我打算假设您只需要从billdetail到付款记录总额的不同费用。在第一部分中使用[inner] JOIN作为费用是很奇怪的,而在付款时使用LEFT(当右边是值的来源时)。

Select sum(f) from
(
Select
        fees
       -
        isnull((Select isnull(SUM (Payment.PlanPaid),0) +
                isnull(SUM (Payment.PatPaid),0) + 
                isnull(SUM (Payment.WriteOff1),0) +
                isnull(SUM (Payment.WriteOff2),0)
        from  Payment 
        where BillDetail.BillDetailID = Payment.BillDetailID),0) f
from BillDetail
where PatientID = @patientid
) X

答案 2 :(得分:0)

试试这个(未经测试但注意“SUM(DISTINCT ...)”)

SELECT SUM(DISTINCT  billdetail.fees) - SUM (Payment.PlanPaid) + SUM (Payment.PatPaid) + SUM (Payment.WriteOff1) + SUM (Payment.WriteOff2)
FROM  BillDetail
LEFT OUTER JOIN Payment
ON BillDetail.BillDetailID = Payment.BillDetailID
WHERE BillDetail.PatientID = @patientid ;