代码之家  ›  专栏  ›  技术社区  ›  Phillip

oracle:在合并列上分组

  •  0
  • Phillip  · 技术社区  · 7 年前

    我有两张桌子 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,我首先需要使用common从两个表中获取所有列 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) 其中 rollno 这是两个表之间的共同点,也是 fare >= fees 从…起 第一 表按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
    

    那么,有人愿意向一个甲骨文新手展示一下我做错了什么吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Josh Eller    7 年前

    看起来这里有几个不同的问题;

    其次,当使用GROUP BY进行聚合时,所有选定列都需要在GROUP BY语句中列出或聚合。如果按rollno和ID分组,您希望adm\u date、fees和type的所有额外值发生什么变化?对于每个不同的rollno和ID对,它们总是相同的吗?

    如果是这样,只需通过语句将其添加到组中,即,

    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、fees和type列,则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
    

    我不确定你是不是想这么做。