使用多行结果进行算术运算

时间:2017-08-16 16:54:03

标签: sql oracle

我正在编写一个查询,将我从子查询收到的计数乘以费用金额,但我不知道该怎么做。任何帮助/建议? Oracle查询是:

select courseid,coursename,fees*tmp 
from course c join registration r on 
r.courseid=c.courseid 
and tmp IN (select count(*) 
from course c join registration r on 
r.courseid=c.courseid group by coursename);

我试图像变量tmp一样使用,但我认为它不适用于oracle查询。有没有其他方法可以这样做?

2 个答案:

答案 0 :(得分:1)

您不能这样做,因为您只能从FROM和WHERE之间出现的表中选择数据。 IN运算符是一种快速的方法来节省必须编写一堆OR语句,它不能在外部查询中建立变量。

取而代之的是:

select courseid,coursename,fees * COUNT(r.courseID) OVER(PARTITION BY c.coursename)
from course c join registration r on 
r.courseid=c.courseid 

编辑/更新:您注意到此查询产生了太多行,您只想查看不同的课程名称。在这种情况下,最好只使用注册表来计算课程中的人数,然后乘以费用:

SELECT
  c.courseid, c.coursename, c.fees * COALESCE(r.numberOfstudents, 0) as courseWorth
FROM
  course c
  LEFT OUTER JOIN
  (select courseid, COUNT(*) as numberofstudents FROM registration GROUP BY courseid) r
  ON c.courseID = r.courseid

答案 1 :(得分:0)

你可以使用像Caius这样的窗口函数,或者你可以使用这样的连接:

 select courseid,coursename, fees * COALESCE(sub.cnt,0) 
 from course c 
 join registration r on r.courseid=c.courseid 
 left join  (
   select coursename, count(*) as cnt
   from course c2 
   join registration r2 on r2.courseid=c2.courseid 
   group by coursename
 ) as sub;
  

注意:我没有声明您的联接是正确的 - 我的基础是您的示例,而不是您对数据模型的任何了解。