选择行数减去另一个字段的总和

时间:2014-06-02 11:34:17

标签: sql sql-server

我有三个名为agencyworkspurchases的表。并且agencypurchases中有works的外键。每个代理商都为我们工作,这些作品保存在works表中,并且每个作品都会给出一个点。例如,一个代理商为我们做了200件作品,所以它有200分 每个代理商都可以通过积分购买我们的产品。在purchases表格中有一个名为price的字段,如果代理机构购买了它将插入purchases表中的产品。 我需要一个SQL查询,它可以告诉我每个代理商的作品数量减去购买量的总和!

像:

select count(works.WID)-SUM(purchases.price) where agency.aid='1'

例如:
像这样的代理商:

 AID='1' name='FirstAgency'  

做一些像:

的作品
WID='1' AID='1' Description='Clean the floor'  
WID='2' AID='1' Description='Clean the window' 
WID='3' AID='1' Description='Clean the floor'  
WID='4' AID='1' Description='Clean the window' 
WID='5' AID='1' Description='Clean the floor'  
WID='6' AID='1' Description='Clean the window' 

所以FirstAgency有6分,因为有6行AID =' 1'在Works表中 和FirstAgency在Purchases表中购买了产品价格为2的产品:

PID='1' AID='1' Price='2'  

所以这个机构现在有6-2 = 4分。我需要一个查询来执行此操作,计算代理点的剩余部分。

1 个答案:

答案 0 :(得分:1)

所以问题是你有n个作品和m个购买而你不想加入表格,因为你会突然遇到n * m个记录。

你可以这样做:

select
  (select count(*) from works w where w.id_agency = a.id_agency) as count_works,
  (select sum(p.price) from purchases p where p.id_agency = a.id_agency) as sum_purchases
from agency a
where a.id_agency = 1;

对于连接也可以这样做,但是你需要一些会使语句模糊的数学运算。我只是为了完整性而展示它'缘故。

select
  count(distinct w.id_work) as count_works,
  coalesce(sum(p.price),0) / greatest(count(distinct w.id_work),1) as sum_purchases
from agency a
left join works w on w.id_agency = a.id_agency
left join purchases p on p.id_agency = a.id_agency
where a.id_agency = 1;