我有2张表FIRST
id,rl_no,adm_date,fees
1,123456,14-11-10,100
2,987654,10-11-12,30
3,4343,14-11-17,20
和SECOND
id,rollno,fare,type
1,123456,20,bs
5,634452,1000,bs
3,123456,900,bs
4,123456,700,bs
我的要求是双重的,
1,我首先需要使用公共rl_no
从两个表中获取所有列。所以我用过:
SELECT a.ID,a.rl_no,a.adm_date,a.fees,b.rollno,b.fare,b.type FROM FIRST a
INNER JOIN
SECOND b ON a.rl_no = b.rollno
输出如下:
id,rl_no,adm_date,fees,rollno,fare,type
1,123456,14-11-10,100,123456,20,bs
1,123456,10-11-12,100,123456,900,bs
1,123456,14-11-17,100,123456,700,bs
2,接下来我想获得两个表之间通用的sum(fare)
的{{1}}以及rollno
来自fare >= fees
表组的FIRST
rollno和id。
我的查询是:
SELECT x.ID,x.rl_no,,x.adm_date,x.fees,x.rollno,x.type,sum(x.fare) as "fare" from (SELECT a.ID,a.rl_no,a.adm_date,a.fees,b.rollno,b.fare,b.type FROM FIRST a
INNER JOIN
SECOND b ON a.rl_no = b.rollno) x, FIRST y
WHERE x.rollno = y.rl_no AND x.fare >= y.fees AND x.type IS NOT NULL GROUP BY x.rollno,x.ID ;
但这是例外。
ORA-00979: not a GROUP BY expression
00979. 00000 - "not a GROUP BY expression"
预期的输出将是这样的:
id,rollno,adm_date,fare,type
1,123456,14-11-10,1620,bs
所以有人可以向oracle新手展示我在这里做错了什么吗?
答案 0 :(得分:0)
看起来这里有几个不同的问题;
首先,您尝试按照不存在的x.ID列进行分组;看起来您似乎想要在子查询中的选定列中添加ID。
其次,在与GROUP BY聚合时,所有选定的列都需要在GROUP BY语句中列出或聚合。如果您按rollno和ID进行分组,那么您希望在adm_date,费用和类型的所有额外值上发生什么?对于每个不同的rollno和ID对,它们总是相同吗?
如果是这样,只需将它们添加到GROUP BY语句,即
GROUP BY adm_date, fees, type, rollno, ID
如果没有,您需要准确地确定如何选择输出哪一个;如果您的输出类似于您的示例(在此处添加ID列)
ID,adm_date,fees,rollno,fare,type
1,14-11-10,100,123456,20,bs
1,10-11-12,100,123456,900,bs
1,14-11-17,100,123456,700,bs
调用该结果集' a'。如果我跑;
SELECT a.ID, a.rollno, SUM(a.fare) as total_fare
FROM a
GROUP BY a.ID, a.rollno
然后结果将是一行;
ID,rollno,total_fare
1,123456,1620
因此,如果您还选择adm_date,费用和类型列,oracle不知道您对它们的意义。你没有使用它们进行分组,你也没有告诉oracle你想如何选择使用哪一个。
您可以执行类似
的操作SELECT a.ID,
FIRST(a.adm_date) as first_adm_date,
FIRST(a.fees) as first_fees,
a.rollno,
SUM(a.fare) as total_fare,
FIRST(a.type) as first_type
FROM a
GROUP BY a.ID, a.rollno
哪会给出结果;
ID,first_adm_date,first_fees,rollno,total_fare,first_type
1,14-11-10,100,123456,1620,bs
我不确定这是不是你的意思。