萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mssql數據庫 >> SQL Server 表交叉顯示及實現方法

SQL Server 表交叉顯示及實現方法

   假設有張學生成績表(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

  如果上述兩表互相換一下:即

  姓名 語文 數學 物理

  張三 73  83  93

  李四 74  84  94

  想變成

  Name Subject Result

  張三 語文  73

  張三 數學  83

  張三 物理  93

  李四 語文  74

  李四 數學  84

  李四 物理  94

  代碼

  create table #t

  (

  姓名 varchar(10) ,

  語文 int ,

  數學 int ,

  物理 int

  )

  insert into #t(姓名 , 語文 , 數學 , 物理) values('張三',73,83,93)

  insert into #t(姓名 , 語文 , 數學 , 物理) values('李四',74,84,94)

  select 姓名 as Name,'語文' as Subject,語文 as Result from #t union

  select 姓名 as Name,'數學' as Subject,數學 as Result from #t union

  select 姓名 as Name,'物理' as Subject,物理 as Result from #t

  order by 姓名 desc

  drop table #t

  Name Subject Result

  ---------- ------- -----------

  張三 數學 83

  張三 物理 93

  張三 語文 73

  李四 數學 84

  李四 物理 94

  李四 語文 74

  (所影響的行數為 6 行)

copyright © 萬盛學電腦網 all rights reserved