一个表table1有3个字段,a,b,c我需要查询如何结果如下,先根据a group by,然后根据b group by,取出sum(c)最大的b,最后查询出a,b来SQL语句应该怎么写

解决方案 »

  1.   

    最好给出完整的表结构,测试数据,计算方法和正确结果.发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  2.   

    我猜测为:select a , b , max(c) c from tb group by a , b或者:select t.* from tb t where c = (select max(c) from tb where a = t.a)
    select t.* from tb t where not exists (select 1 from tb where a = t.a and c > t.c)
      

  3.   

    测试数据a,b,c
    客户a,地方1,金额500
    客户a,地方1,金额200
    客户a,地方2,金额300
    客户a,地方1,金额100
    客户a,地方2,金额400
    客户b,地方1,金额500
    客户b,地方3,金额1000
    客户b,地方1,金额100
    客户b,地方1,金额200
    客户b,地方2,金额400查询结果客户a,地方1
    客户b,地方3
      

  4.   

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

  5.   

    --这个
    SELECT a, b
      FROM (SELECT a, b, c, row_number() over(PARTITION BY a ORDER BY c DESC) rn FROM tab)
     WHERE rn = 1;
      

  6.   

    with aa as (
    select 1 a, 11 b, 1 c from dual union all
    select 1 a, 11 b, 2 c from dual union all
    select 1 a, 12 b, 5 c from dual union all
    select 2 a, 12 b, 3 c from dual union all
    select 3 a, 11 b, 4 c from dual)
    select b 
    from(
    select a,
           b,
           sum(c),
           row_number() over(partition by a order by sum(c) desc) rn
           from aa
           group by a,b)
    where rn = 1;
      

  7.   


    如果是这个需求,则见2楼后面的语句即可,以下是在sql server中实现的,其查询sql语句在oracle中同样适用。
    create table tb(a varchar(10),b varchar(10),c int)
    insert into tb values('客户a','地方1',500)
    insert into tb values('客户a','地方1',200)
    insert into tb values('客户a','地方2',300)
    insert into tb values('客户a','地方1',100)
    insert into tb values('客户a','地方2',400)
    insert into tb values('客户b','地方1',500)
    insert into tb values('客户b','地方3',1000)
    insert into tb values('客户b','地方1',100)
    insert into tb values('客户b','地方1',200)
    insert into tb values('客户b','地方2',400)
    goselect t.a , t.b from tb t where c = (select max(c) from tb where a = t.a) order by t.aselect t.a , t.b from tb t where not exists (select 1 from tb where a = t.a and c > t.c) order by t.a
    drop table tb/*
    a          b          
    ---------- ---------- 
    客户a        地方1
    客户b        地方3(所影响的行数为 2 行)a          b          
    ---------- ---------- 
    客户a        地方1
    客户b        地方3(所影响的行数为 2 行)
    */
      

  8.   

    create table tb(a nvarchar(10),b nvarchar(10),c int)
    insert into tb values(N'客户a',N'地方1',500)
    insert into tb values(N'客户a',N'地方1',200)
    insert into tb values(N'客户a',N'地方2',300)
    insert into tb values(N'客户a',N'地方1',100)
    insert into tb values(N'客户a',N'地方2',400)
    insert into tb values(N'客户b',N'地方1',500)
    insert into tb values(N'客户b',N'地方3',1000)
    insert into tb values(N'客户b',N'地方1',100)
    insert into tb values(N'客户b',N'地方1',200)
    insert into tb values(N'客户b',N'地方2',400)
    goSELECT a, b
    FROM (SELECT a, b, c, row_number() over(PARTITION BY a ORDER BY c DESC) rn FROM tb) a
    WHERE rn = 1select t.a , t.b from tb t where c = (select max(c) from tb where a = t.a) order by t.adrop table tb
      

  9.   


    大侠,我测试了下,是正确的但是我还有两个问题1。我无法理解其中逻辑,都没有出现b字段的条件判断,为什么最终取出来的恰好是我要的要求2。如果出现B字段对应的SUM(c)出现相同的值,那么就会查出多条记录,但是我希望对于A来说是一直是单条记录,如果B有重复那就取第一条,如果让查询结果中,A不重复,我用Group By t.a,t.b发现不行!
      

  10.   

    难怪,我发现查询是错误的,不是我要的要求例如insert into tb values('客户a','地方1',500)
    insert into tb values('客户a','地方1',200)
    insert into tb values('客户a','地方2',1000)
    insert into tb values('客户a','地方1',400)
    insert into tb values('客户b','地方1',5000)
    insert into tb values('客户b','地方3',10000)
    insert into tb values('客户b','地方1',9000)
    insert into tb values('客户b','地方1',200)
    insert into tb values('客户b','地方2',4000)
    insert into tb values('客户c','地方4',4000)
    insert into tb values('客户c','地方5',4000)
    insert into tb values('客户c','地方6',4000)
    我要的结果对于客户a来说,应该是客户a,地方1,而你的SQL语句出来是客户a,地方2因为根据我的要求,在所有客户a的记录里,地方1对应的金额和应该是1100
    地方2对应的金额和应该是1000,所以应该出来地方1