Oracle中SUM(COUNT())用法问题:关联表衍生列计算
解决Oracle中衍生列(出勤人数×课程单价)的计算问题
嘿,我看你想要生成一个计算每门课程总收入的衍生列,也就是用关联表的出勤人数乘以课程单价对吧?你的尝试语句里有个小问题,咱们调整一下就好啦~
问题分析
你原来的语句里用了sum(count(*)*c.FEE),这里犯了嵌套聚合函数的错误——count(*)本身已经是分组后的聚合结果(统计每门课程的出勤记录数),不需要再用sum去包裹它。而且只要同一个course_id对应的课程单价c.FEE是唯一的(这也是课程表的合理设计),直接用出勤人数乘以单价就能得到总收入。
修正后的SQL语句
SELECT a.course_id, COUNT(*) * c.FEE AS "Income", -- 核心:出勤记录数 × 课程单价 = 总收入 c.COURSE_NAME, c.STORE, c.VENUE, c.COURSE_LEVEL, c.COURSE_DATE, c.DURATION, c.FEE, c.STAFF FROM attendancecheck a INNER JOIN course c ON a.course_id = c.course_id GROUP BY a.course_id, c.COURSE_NAME, c.STORE, c.VENUE, c.COURSE_LEVEL, c.COURSE_DATE, c.DURATION, c.FEE, c.STAFF;
额外说明
- 如果你的
attendancecheck表中可能存在同一用户多次打卡的重复记录,想要统计实际不同的出勤人数,可以把COUNT(*)改成COUNT(DISTINCT a.user_id)(假设表中有user_id字段标识用户),避免重复计数。 - 另一种等价写法是用
SUM(c.FEE)代替COUNT(*) * c.FEE,因为每个出勤记录都会对应一次课程单价,求和的结果和人数×单价是完全一致的,你可以根据习惯选择。
内容的提问来源于stack exchange,提问作者Daniel Lawton
相关产品推荐
相关产品推荐

