oracle:对合并列进行分组

时间:2017-11-22 12:27:42

标签: oracle10g

我有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新手展示我在这里做错了什么吗?

1 个答案:

答案 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

我不确定这是不是你的意思。