Create table test (name char(10),km char(10),cj int)insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)想变成姓名   语文   数学   英语
张三   80     86     75
李四   78     85     78
其中KM列数不定,也就说课目是动态变化的解决方法:
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
 from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
这种方式对我当前项目中使用不便,现在我想不用EXEC方式执行,想写成一条SQL语句执行,请大侠们帮帮我,为此我想了两天了!

解决方案 »

  1.   


    select name,
    sum(decode(km,'语文',cj,0)),
    sum(decode(km,'数学',cj,0)),
    sum(decode(km,'英语',cj,0))
    from test
    group by name
      

  2.   

    参考:http://www.cnoug.org/viewthread.php?tid=21713
      

  3.   

    oracle9i的新特性 pivoting insert :insert all
      into sales_info values (employee_id,week_id,sales_mon)
      into sales_info values (employee_id,week_id,sales_tue)
      into sales_info values (employee_id,week_id,sales_wed)
      into sales_info values (employee_id,week_id,sales_thur)
      into sales_info values (employee_id,week_id,sales_fri)
    select employee_id,week_id,sales_mon,sales_tue,sales_wed,sales_thur,sales_fri
    from sales_source_data;需要讲座的话,可以给你传.
      

  4.   

    如果科目数量不定的话,可以考虑用Proceduredeclare
      cursor csr is
        select distinct (km) from t;
      tmp_km varchar2(6);
      str    varchar2(4000);
    begin
      str := 'select name';
      open csr;
       loop fetch csr into tmp_km;
      exit when csr%notfound;
      str := str || ',sum(decode(km,' || chr(39) || tmp_km || chr(39) ||
             ',cj,0)) ' || tmp_km;
    end loop;
    str := str || ' from t group by name';
    dbms_output.put_line(str);
    execute immediate str;
    end;
      

  5.   

    to zlz_212():
            课目是不定的,除了列出的课目,它可能还化学,物理等,其具体数目事先不知!
    to zhpsam109(昊子鳖鳖 Jerry):
            没有找到能我所要的SQL方法,大多与zlz_212()提供的方法差不多!
      

  6.   

    看我第二个回复动态生成需要的SQL语句,然后再执行
      

  7.   

    这种不定的列一般只能老老实实地用procecedure写,要是什么都一句搞定,那procedure还拿来干嘛,更别说效率问题.
    其实还有一点也很重要,就是你写的代码一定要有可读性.
      

  8.   

    楼主问的是SQL Server的问题?
      

  9.   

    Create table test1 (name VARCHAR2(100),km VARCHAR2(100),cj int);insert into test1(name, km,cj) values('张三','语文',80);
    insert into test1 values('张三','数学',86);
    insert into  test1 values('张三','英语',75);
    insert into test1 values('李四','语文',78);
    insert into test1 values('李四','数学',85);
    insert into test1 values('李四','英语',78);
    select name,
    sum(decode(km,'语文',CJ,0)) 语文 ,
    sum(decode(km,'数学',cj,0)) 数学,
    sum(decode(km,'英语',cj,0)) 英语
    from test1
    group by name这样就是你想要的结果了
      

  10.   

    用存储过程吧,用sql语句好像解决不了
      

  11.   

    明明能解决嘛select name,
    sum(decode(km,'语文',CJ,0)) 语文 ,
    sum(decode(km,'数学',cj,0)) 数学,
    sum(decode(km,'英语',cj,0)) 英语
    from test1
    group by name