2010-11-22 49 views
1

目标:MySQL查询有两个条件内嵌SELECT的

  • 有两个表,校友的表和缴款表 - 每一个贡献主要来自校友的ID
  • 获取列表相关有 的校友在2002-10-10和2003-10-10的日期 范围内贡献2-3000。
  • 结果需要显示校友的姓名,ID,每个校友的总所有时间给出,而且每个校友总给出了 指定日期范围内

的尝试:

SELECT alumni.alumni_id, alumni.alumni_name, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id) AS contrib_alltime_total, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) AS contrib_range_total 

FROM alumni 
WHERE hold_code IS NULL  
ORDER BY lname ASC  
HAVING contrib_range_total >= 2000 
HAVING contrib_range_total <= 3000 

我得到一个语法错误,很可能是因为我试图使用两个HAVING的

我也意识到你想使用一个HAVING与GROUP BY,但我不需要d o任何分组

我大概可以这样做,但我认为它效率低下,可能需要很长的时间

SELECT alumni.alumni_id, alumni.alumni_name, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id) AS contrib_alltime_total, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) AS contrib_range_total 

FROM alumni 

WHERE hold_code IS NULL 
AND (SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) >= 2000 
AND (SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) <= 3000 

ORDER BY lname ASC 

什么将是实现这一目标的最快和最有效的方法是什么?任何意见是值得欢迎的,感谢您的时间

回答

0
SELECT a.alumni_id, 
sum(c.contributed_amt) AS contrib_alltime_total, 
sum(case when c.contribution_date BETWEEN '2002-10-10' AND '2003-10-10' then c.contributed_amt else 0 end) AS contrib_range_total 
FROM alumni a 
INNER JOIN contribution c ON c.alumni_id = a.alumni_id 
WHERE a.hold_code IS NULL 
GROUP BY a.alumni_id 
HAVING contrib_range_total BETWEEN 2000 AND 3000 
0
SELECT a.alumni_id, a.alumni_name, 
SUM(c.contributed_amt) AS contrib_alltime_total, 
SUM(c.contributed_amt) AS contrib_range_total 

FROM alumni a, contribution c 

WHERE a.hold_code IS NULL 
AND c.alumni_id = a.alumni_id AND c.date BETWEEN '2002-10-10' AND '2003-10-10' 
AND contrib_range_total BETWEEN 2000 AND 3000 
ORDER BY lname ASC 
+0

您的建议并不完美,所以我修改了它,但是我收到一条错误“组函数的使用无效” SELECT a.alumni_id, (SELECT SUM(contribute_amt)FROM contribution WHERE contribution.alu mni_id = a.alumni_id)AS contrib_alltime_total, SUM(c.contributed_amt)AS contrib_range_total FROM校友,贡献Ç WHERE a.hold_code IS NULL AND = c.alumni_id a.alumni_id AND BETWEEN c.contribution_date' 2002-10-10'AND'2003-10-10' AND SUM(c.contributed_amt)BETWEEN 2000 AND 3000 GROUP BY a.alumni_id ORDER BY a.lname ASC – samJL 2010-11-23 01:59:05

0

我不认为你可以使用HAVING没有GROUP BY,也使用AND加入多个HAVING箱子...

GROUP BY contrib_range_total HAVING contrib_range_total >= 2000 AND contrib_range_total <= 3000