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
    --結(jié)果
    姓名 數(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 行)