select t.日期,
sum(decode(t.业务员,'张三',t.销售额,0)),
sum(decode(t.业务员,'李四',t.销售额,0)) 
from table t group by t.日期

解决方案 »

  1.   

    with t as(select '20131101' rq,'张三' name, '20'yj from dual
    union all
    select '20131102' rq,'张三' name, '30'yj from dual
    union all
    select '20131101' rq,'李四' name, '20'yj from dual
    union all
    select '20131102' rq,'李四' name, '30'yj from dual
      
       )
    select rq,sum(a) as "张三" ,sum(b)  as "李四" from 
    (
    select rq,case when name='张三' then sum(yj) end a,case when name='李四' then sum(yj)  end b
    from t group by rq,name) 
    group by rq
      

  2.   


    这个sum是怎么把列转成行的?
      

  3.   

    create table test_row_con(
    month_id varchar2(10),
    name varchar2(10),
    sales number
    );
    --插入测试数据
    select * from test_row_con for update;--方法一 使用decode实现行转列
    select month_id,
           sum(decode(name, '张三', sales, 0)) "张三",
           sum(decode(name, '李四', sales, 0)) "李四"
      from test_row_con
     group by month_id;
    --方法二 使用oracle11g新特性pivot
    该新特性可以参考oracle官方文档:http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html
    select *
      from test_row_con pivot((sum(sales)) for name in ('张三' as "张三", '李四' as "李四"));
    --方法三 使用存储过程 此处省略
      

  4.   


    这个sum是怎么把列转成行的?可以理解为第二列的意思是判断每一行的业务员是否是'张三',如果是那么这一行的这列数据是销售额,如果不是'张三',那么这一行的这列数据是0,对这一列做sum,就相当于把所有'张三'的销售额加起来(其他人的都为0了)
    第三列同理楼主可以先不加sum和group by,看看执行的结果是什么样的,应该就能看明白
      

  5.   


    这个sum是怎么把列转成行的?
    首先,你这是列转行。
    然后理解的话,你可以把整个过程分成两部走你就懂了:
    1、select t.日期,decode(t.业务员,'张三',t.销售额,0),decode(t.业务员,'李四',t.销售额,0) 
    from table t
    此步先把数据先转成行,根据decode函数把数据筛选,没有的为0.
    2、此步group by 日期,把数据根据日期sum。