2017-08-16 46 views
-1

我正在写一个查询,以将从子查询中收到的计数与费用数量相乘,但我不知道该怎么做。任何帮助/建议? 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

您不能那样做,因为您只能从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 
+0

它的工作原理..但是,让我们说有多个相同的课程名称,但我只想要不同名称的行..我怎么能做到这一点? –

+0

这是一个更经典的分组查询。我将编辑我的答案以包含一个示例 –

+0

我没有抱怨的权利,因为我是一个请求帮助的人。顺便说一句,谢谢,这正是我所期待的。谢谢。 –

1

您可以使用窗口函数像凯斯也可以使用连接像这样的:

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; 

注:我并没有要求你的加入是正确的 - 我立足此查询过您的例子不是在你的数据模型的任何知识。

+0

我忘了一件事 - 重复使用r和c作为主查询内外的别名;会导致oracle对被协调的子查询感到困惑吗? –

+0

@CaiusJard可能会给出错误。 – Hogan

+0

它工作正常,只是我无法进行算术运算。 –