表a结构为
字段1  |  字段2
------------------
A01       001
A01       002
A01       003
A01       009
B01       001
B01       002
B01       089
...现请教用SQL达到以下数据要求:
字段1 | 字段2 | 字段3 | 字段4 | 字段5 | 字段6
A01       001     002     003     009
B01       001     002                   089
...谢谢!

解决方案 »

  1.   

    这两个sql都可以实现,但是不是一句。
    sql语句的select部分要生成。
    如果楼主强行写成一句sql,估计会很麻烦。最终的sql类似如下:select 字段1,max(case when 字段2='001' then 字段2 end ) as 字段2,max(case when 字段2='002' then 字段2 end ) as 字段3,max(case when 字段2='003' then 字段2 end ) as 字段3,..........
    from a
    where 1;
      

  2.   

    sql语句的select部分要动态生成。用语言生成。
    相信到此,楼主应该已经会了吧。
      

  3.   

    用语句生成CASE...,这倒不用说.我的目的是利用DBM的性能达到效率的要求.
    以下是MS SQL的语句,如何转为MySQL4.0? 研究中...    
      假设有张学生成绩表(t)如下   
        
              Name   Subject   Result   
              张三   语文  73   
              张三   数学  83   
              张三   物理  93   
              李四   语文  74   
              李四   数学  84   
              李四   物理  94   
        
              想变成     
              姓名   语文   数学   物理   
              张三   73  83  93   
              李四   74  84  94   
        
              create   table   #t   
              (   
              Name         varchar(10)   ,   
              Subject   varchar(10)   ,   
              Result     int   
              )   
        
              insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','语文','73')   
              insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','数学','83')   
              insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','物理','93')   
              insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','语文','74')   
              insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','数学','83')   
              insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','物理','93')   
        
              declare   @sql   varchar(8000)   
              set   @sql   =   'select   Name   as   '   +   '姓名'   
              select   @sql   =   @sql   +   '   ,   sum(case   Subject   when   '''   +   Subject   +   '''   then   Result   end)   ['   +   Subject   +   ']'   
              from   (select   distinct   Subject   from   #t)   as   a   
              set   @sql   =   @sql   +   '   from   #t   group   by   name'   
              exec(@sql)     
        
              drop   table   #t   
        
              --结果   
              姓名               数学                 物理                 语文                       
              ----------   -----------   -----------   -----------     
              李四               83                     93                     74   
              张三               83                     93                     73
      

  4.   

    你就6个字段可以不用动态生成,不多可以写死select 字段1,(case when 字段2='001' then 字段2 end ) as 字段2,(case when 字段2='002' then 字段2 end ) as 字段3,(case when 字段2='003' then 字段2 end ) as 字段3,..........
    from a
    where 1;
    把前面的sql中max去掉就可以了
      

  5.   

    呵呵,不好意思,我写错了,max是必须使用的,否则,得到的将不是需要的。我少写了个 group by 完整的应该如下:
    select 字段1,max(case when 字段2='001' then 字段2 end ) as 字段2,max(case when 字段2='002' then 字段2 end ) as 字段3,max(case when 字段2='003' then 字段2 end ) as 字段3,..........
    from a
    where 1 group by 字段1;
      

  6.   

    MySQL4.0 没有存储过程。select Name ,sum(case when Subject = '语文' then ifnull(Result,0) else 0 end ) as '语文',sum(case when Subject = '数学' then ifnull(Result,0) else 0 end ) as '数学',sum(case when Subject = '英语'then ifnull(Result,0) else 0 end ) as '英语'
    from t
    where 1 group by Name
    实际使用时,要注意转换标点符号。('语文' 两面的单引号可能不对)
    本sql没有经过调试。
      

  7.   

    先给相同的f1的数据编号。然后用个理论上限,比如20个
    然后用 whalefish2001(whale) 方法 转换就可以