表一 table_a      可扩展
 a_id   | style|
  1        37      
  2        38
  3        39
  4        40表二 table_b
 b_id |  a_id  | amount 
 001       1       10
 001       2       5  
 001       3       20
 002       1       3 
 002       3       9查询结果按 b_id 分组 
显示为。
 b_id | 37 | 38 | 39 | 40
 001    10    5   20  
 002     3         9sql 怎么写? 

解决方案 »

  1.   

    行列转换..精华里一堆的..CASE WHEN
      

  2.   

    --参考
    *
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------
      

  3.   

    -- =========================================
    -- -----------t_mac 小编-------------
       ---希望有天成为大虾---- 
    -- =========================================IF OBJECT_ID('tb1') IS NOT NULL
      DROP TABLE tb1
    GO
    CREATE TABLE tb1(aid int ,stytle int)
    go
    insert into tb1
    select
    1  ,      37   union all select    
      2  ,      38 union all select
      3  ,      39 union all select
      4  ,      40   
    go
    IF OBJECT_ID('tb2') IS NOT NULL
      DROP TABLE tb2
    GO
    CREATE TABLE tb2(bid int,aid int ,amont int)
    go
    insert into tb2
    select
    001 ,     1   ,   10 union all select
    001 ,     2   ,   5  union all select
    001  ,    3  ,    20 union all select
    002  ,    1   ,   3 union all select
    002  ,    3    ,  9 
    go
    select bid,stytle,amont into #k  from tb1 join tb2 on tb1.aid=tb2.aid 
    select bid,[37]=ISNULL([37],0),[38]=ISNULL([38],0),[39]=ISNULL([39],0),[40]=ISNULL([40],0) from #k
     pivot(max(amont) for stytle in([37],[38],[39],[40]))as t/*------------
    bid         37          38          39          40
    ----------- ----------- ----------- ----------- -----------
    1           10          5           20          0
    2           3           0           9           0-------*/
      

  4.   


    create table table_a
    (a_id int,style int)insert into table_a
    select 1,37 union all
    select 2,38 union all
    select 3,39 union all
    select 4,40 create table table_b
    (b_id varchar(10),a_id int,amount int)insert into table_b
    select '001',1,10 union all
    select '001',2,5 union all
    select '001',3,20 union all
    select '002',1,3 union all
    select '002',3,9 select b_id,style ,amount into #tb 
    from table_a  a join table_b  b on a.a_id = b.a_idselect * from #tb select * from #tb a pivot (max(amount) for style in ([37],[38],[39],[40])) b
      

  5.   


    'pivot' 附近有语法错误。 这是怎么回事? 我sql2000
      

  6.   

    select b_id  ,
      max(case style when 37 then amount else 0 end) [37],
      max(case style when 38 then amount else 0 end) [38],
      max(case style when 39 then amount else 0 end) [39],
      max(case style when 40 then amount else 0 end) [40]
    from #tb
    group by b_id
      

  7.   

    create table tb1(a_id varchar(2) , style int)
    create table tb2(b_id varchar(3) , a_id varchar(2),amount int)
    go
    insert into tb1 values('1' , 37)
    insert into tb1 values('2' , 38)
    insert into tb1 values('3' , 39)
    insert into tb1 values('4' , 40)
    go
    insert into tb2 values('001' , '1' , 10)
    insert into tb2 values('001' , '2' , 5)
    insert into tb2 values('001' , '3' , 20)
    insert into tb2 values('002' , '1' , 3)
    insert into tb2 values('002' , '3' , 9)
    godeclare @sql varchar(2000)
    set @sql='select b_id '
    select @sql=@sql+',max(case tb2.a_id when '+tb1.a_id+' then amount else 0 end)['+cast(style as varchar)+']'
    from tb1
    left join tb2
    on tb1.a_id=tb2.a_id
    group by tb1.style,tb1.a_idset @sql=@sql+' from tb2 group by b_id'
    exec (@sql)
    go
    drop table tb1,tb2