我有一个包含以下列的表。
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
答案 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 ;