- 有两个表,校友的表和缴款表 - 每一个贡献主要来自校友的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
什么将是实现这一目标的最快和最有效的方法是什么?任何意见是值得欢迎的,感谢您的时间
您的建议并不完美,所以我修改了它,但是我收到一条错误“组函数的使用无效” 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