2011-02-11 75 views
1

因此,我在此查询此查询,但无法弄清楚如何更改行为。基本上它应该从应用程序表中返回一组结果,支付表的总付款与相应的ID以及费用表中的总费用和相应的ID。当有一笔支付一笔费用时,它是完美的。但是,如果有两项费用,支付额似乎会增加一倍。我假设如果有3个费用,它会增加三倍,等等。左连接,其中有2个结果在一张表中,将相应表格的结果总和加倍。

我试着做总和(不同payments.amount)作为付款,但问题是,它是完全可能的,相同数量。我不确定是否有可能喜欢,做一个总和的地方有一个与数额相对应的独特ID ..我仍然在学习SQL。

select applications.*, 
permits.title as permit, 
sum(payments.amount) as payments, 
sum(fees.unitprice) as fees 
from applications 
left join permits on applications.permitid=permits.id 
left join payments on payments.appid=applications.id 
left join fees on fees.appid=applications.id 
where applications.deleted=0 
and payments.deleted=0 
and fees.deleted=0 
and fees.unitPrice > 0 
and applicationdate between '1975-1-1' and '2011-2-10' 
group by applications.id 
order by permits.deptid,permits.title,status,dateissued,applicationdate 

任何帮助将不胜感激 - 我一直在试图解决这个问题好几个小时!为了弄清楚是什么导致了它,我带了几个。

回答

1

您可以在派生表中进行聚合并加入到该表中。

... join (SELECT fees.appid, sum(fees.unitprice) as fees 
        FROM fees 
        WHERE fees.deleted = 0 
         and fees.unitPrice > 0 
        GROUP BY fees.appid) aggregatedfees 
     on aggregatedfees.appid = applications.id 
... 

顺便说一句:所有你的左连接都被你的where子句转换为内连接。

+0

太棒了!谢谢。我也对付款表做了同样的处理,所以我有两个子查询正在进行。效果很好,甚至不慢。上次我尝试做一个子查询时,我犯了一个错误,试图执行一个WHERE payments.appid = applications.id,但那不起作用,所以我放弃了。我必须记住现在如何做到这一点。再次感谢! – 2011-02-11 17:07:24

相关问题