昨天问了一个分组的问题,但是回答的SQL语句一直不对,再发一个帖子寻求高人问题描述如下:有一个表table1 有三个字段a,b,c我想在对a分组后,在分组数据里,再group by b order by sum(c)进行排序,最终取出sum(c)最大的
a,b字段示例数据如下
insert into table1 values('客户a','地方1',500)
insert into table1 values('客户a','地方1',200)
insert into table1 values('客户a','地方2',300)
insert into table1 values('客户a','地方1',100)
insert into table1 values('客户a','地方2',400)
insert into table1 values('客户b','地方1',500)
insert into table1 values('客户b','地方3',1400)
insert into table1 values('客户b','地方1',100)
insert into table1 values('客户b','地方1',700)
insert into table1 values('客户b','地方2',400)
可以看到,在客户a的所有记录里,地方1对应的和是500+200+100=800,地方2对应的和是300+400=700
所以查询结果里第一条数据是'客户a','地方1'
而在客户b的记录里,地方1对应的和是500+100+700=1300,地方2对应的和是400,地方3对应的和是1400
所以查询结果里第二条数据是'客户b','地方3'
最终的查询结果为'客户a','地方1'
'客户b','地方3'
如何写这条SQL语句?各位大侠请教了!

解决方案 »

  1.   

    select a,b
    from 
    (
    select a,b,row_number() over(partition by a,b order by c desc) r1
    from (
    select a,b, sum(c) over(partition by a,b) c
    from table1
    ) t
    ) tt
    where r1 = 1
      

  2.   

    --1、常规group by
    WITH tab AS
     (SELECT a, b, SUM(c) s FROM table1 GROUP BY a, b)
    SELECT tab.a, tab.b
      FROM tab, (SELECT a, MAX(s) ms FROM tab GROUP BY a) t
     WHERE tab.a = t.a AND
           tab.s = t.ms
     ORDER BY tab.a;
     
    --2、使用分析函数row_number,rank等
    SELECT a,b
      FROM (SELECT a, b, row_number() over(PARTITION BY a ORDER BY s DESC) rn
              FROM (SELECT a, b, SUM(c) s FROM table1 GROUP BY a, b))
     WHERE rn = 1;
      

  3.   

    select a, b
      from (select a, b, rank() over(partition by a order by sum(c) desc) rk
              from table1
             group by a, b)
     where rk = 1
      

  4.   

    SELECT a,b
      FROM (SELECT a, b, row_number() over(PARTITION BY a ORDER BY s DESC) rn
              FROM (SELECT a, b, SUM(c) s FROM table1 GROUP BY a, b))
     WHERE rn = 1;
      

  5.   

    引用三楼:
    --1、常规group by WITH tab AS  (SELECT a, b, SUM(c) s FROM table1 GROUP BY a, b) SELECT tab.a, tab.b FROM tab, (SELECT a, MAX(s) ms FROM tab GROUP BY a) t WHERE tab.a = t.a AND  tab.s = t.ms ORDER BY tab.a; 
    --2、使用分析函数row_number,rank等 SELECT a,b FROM (SELECT a, b, row_number() over(PARTITION BY a ORDER BY s DESC) rn FROM (SELECT a, b, SUM(c) s FROM table1 GROUP BY a, b)) WHERE rn = 1;
      

  6.   


    drop table table1;
    create table table1(
        a   varchar2(7)
        ,b  varchar2(7)
        ,c  number
    );
    insert into table1 values('客户a','地方1',500);
    insert into table1 values('客户a','地方1',200);
    insert into table1 values('客户a','地方2',300);
    insert into table1 values('客户a','地方1',100);
    insert into table1 values('客户a','地方2',400);
    insert into table1 values('客户b','地方1',500);
    insert into table1 values('客户b','地方3',1400);
    insert into table1 values('客户b','地方1',100);
    insert into table1 values('客户b','地方1',700);
    insert into table1 values('客户b','地方2',400);
    commit;select 
        A, B
    from 
        (
        select A, B, sum(C) as sum_c
        from table1
        group by A, B
        ) a
    where 
        sum_c = (select max(sum_c) 
                 from 
                     (
                     select A, B, sum(C) as sum_c
                     from table1
                     group by A, B
                     ) b
                 where b.A = a.A);