SQL Server 表交叉顯示及實現(xiàn)方法

字號:


    假設有張學生成績表(t)如下:
    Name Subject Result
    張三 語文73
    張三 數(shù)學83
    張三 物理93
    李四 語文74
    李四 數(shù)學84
    李四 物理94
    想變成
    姓名 語文 數(shù)學 物理
    張三 738393
    李四 748494
    代碼
    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('張三','數(shù)學','83')
    insert into #t(Name , Subject , Result) values('張三','物理','93')
    insert into #t(Name , Subject , Result) values('李四','語文','74')
    insert into #t(Name , Subject , Result) values('李四','數(shù)學','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
    --結果
    姓名 數(shù)學 物理 語文
    ---------- ----------- ----------- -----------
    李四 83 93 74
    張三 83 93 73
    如果上述兩表互相換一下:即
    姓名 語文 數(shù)學 物理
    張三 738393
    李四 748494
    想變成
    Name Subject Result
    張三 語文73
    張三 數(shù)學83
    張三 物理93
    李四 語文74
    李四 數(shù)學84
    李四 物理94
    代碼
    create table #t
    (
    姓名 varchar(10) ,
    語文 int ,
    數(shù)學 int ,
    物理 int
    )
    insert into #t(姓名 , 語文 , 數(shù)學 , 物理) values('張三',73,83,93)
    insert into #t(姓名 , 語文 , 數(shù)學 , 物理) values('李四',74,84,94)
    select 姓名 as Name,'語文' as Subject,語文 as Result from #t union
    select 姓名 as Name,'數(shù)學' as Subject,數(shù)學 as Result from #t union
    select 姓名 as Name,'物理' as Subject,物理 as Result from #t
    order by 姓名 desc
    drop table #t
    Name Subject Result
    ---------- ------- -----------
    張三 數(shù)學 83
    張三 物理 93
    張三 語文 73
    李四 數(shù)學 84
    李四 物理 94
    李四 語文 74
    (所影響的行數(shù)為 6 行)