我有这样一个表:
A           A                1
A           B                2
A           C                3
B           A                4
B           B                5
B           C                6
C           A                7
C           B                8
C           C                9
现在我要生成如下的一个临时表, 如何写SQL:S\D         A                B            C
A           1                2            3
B           4                5            6
C           7                8            9

解决方案 »

  1.   

    参考:
    create table test (姓名 char(10),课程 char(10),成绩 int)
    go
    insert test values('张三','语文',80)
    insert test values('张三','数学',86)
    insert test values('张三','英语',75)
    insert test values('李四','语文',78)
    insert test values('李四','数学',85)
    insert test values('李四','英语',78)
    select * from test
    declare @sql varchar(8000)
    set @sql = 'select 姓名'
    select @sql = @sql + ',sum(case 课程 when '''+课程+''' then 成绩 end) ['+课程+']'
    from (select distinct 课程 from test) as a
    select @sql = @sql+' from test group by 姓名'
    exec(@sql)drop table test--结果
    /* 
    姓名  课程  成绩
    张三  语文  80
    张三  数学  86
    张三  英语  75
    李四  语文  78
    李四  数学  85
    李四  英语  78姓名  数学  英语  语文
    李四  85    78    78
    张三  86    75    80
    */
      

  2.   

    create table test (C1 char(10),C2 char(10),C3 int)
    go
    insert test values('A','A',1)
    insert test values('A','B',2)
    insert test values('A','C',3)
    insert test values('B','A',4)
    insert test values('B','B',5)
    insert test values('B','C',6)
    insert test values('C','A',7)
    insert test values('C','B',8)
    insert test values('C','C',9)
    select * from test
    declare @sql varchar(8000)
    set @sql = 'select C1 AS [S\D]'
    select @sql = @sql + ',sum(case C2 when '''+C2+''' then C3 end) ['+C2+']'
    from (select distinct C2 from test) as a
    select @sql = @sql+' from test group by C1'
    exec(@sql)drop table test--结果
    /* 
    C1  C2  C3
    A   A    1
    A   B    2
    A   C    3
    B   A    4
    B   B    5
    B   C    6
    C   A    7
    C   B    8
    C   C    9S、D A    B        C
    A   1 2 3
    B   4 5 6
    C   7 8 9
    */
      

  3.   


    create table T([S\D] char(1), col2 char(1), col3 int)
    insert T select 'A',           'A',                1
    union all select 'A',           'B',                2
    union all select 'A',           'C',                3
    union all select 'B',           'A',                4
    union all select 'B',           'B',                5
    union all select 'B',           'C',                6
    union all select 'C',           'A',                7
    union all select 'C',           'B',                8
    union all select 'C',           'C',                9declare @sql varchar(8000)
    set @sql='select [S\D],'
    select @sql=@sql+quotename(col2)+'=max(case when col2='+quotename(col2, '''')+' then col3 end),'
    from T
    group by col2select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by [S\D]'
    exec(@sql)--result
    S\D  A           B           C           
    ---- ----------- ----------- ----------- 
    A    1           2           3
    B    4           5           6
    C    7           8           9
      

  4.   

    --用表名、第一列作存储过程的参数
    create table test (C1 char(10),C2 char(10),C3 int)
    go
    insert test values('A','A',1)
    insert test values('A','B',2)
    insert test values('A','C',3)
    insert test values('B','A',4)
    insert test values('B','B',5)
    insert test values('B','C',6)
    insert test values('C','A',7)
    insert test values('C','B',8)
    insert test values('C','C',9)
    gocreate proc row_col_change
    @tbname varchar(20),
    @colname varchar(20)
    as
    declare @sql varchar(8000)
    set @sql = 'select '+@colname+' AS [S\D]'
    select @sql = @sql + ',sum(case C2 when '''+C2+''' then C3 end) ['+C2+']'
    from (select distinct C2 from test) as a
    select @sql = @sql+' from '+@tbname+' group by '+@colname
    exec(@sql)
    goexec row_col_change 'test','C1'drop table test
    drop proc row_col_change--结果
    /* 
    S\D A    B     C
    A   1 2     3
    B   4 5     6
    C   7 8     9
    */
      

  5.   

    多谢大家,怪我没有说清楚,
    我的表中不一定只有ABC三个,可能有N个,如果有N个的话,就会有N*N行,如N=4则:A           A                1
    A           B                2
    A           C                3
    A           d                3  
    B           A                4
    B           B                5
    B           C                6
    B           D                6
     C           A                7
    C           B                8
    C           C                9
    C           D                10
    D           A                 11
    D           B                 12
    D           C                 13
    D           D                  14
      

  6.   

    一样的效果,我们用的是动态SQL