当前位置: 代码迷 >> Sql Server >> sqlserver2008 多列的 行列转换有关问题?
  详细解决方案

sqlserver2008 多列的 行列转换有关问题?

热度:536   发布时间:2016-04-24 09:28:17.0
sqlserver2008 多列的 行列转换问题?? 求助
本帖最后由 BIBIHAHA 于 2015-01-17 16:16:29 编辑
现有下面的表 
日期                   学号       名字       语文        数学    英语
2014/10/1            1           甲          98            80       60  
2014/10/1           2           乙            100          40      70
2014/10/1           3           丙            50             20      100
2014/11/1            1           甲          90            80       60  
2014/11/1           2           乙            10          42      70
2014/11/1           3           丙            60             20      100
2014/12/1            1           甲          98            83       60  
2014/12/1           2           乙            100          45      70
2014/12/1           3           丙            50             90      100

想转换为  
学号   名字   科目      2014/10/1    2014/11/1  2014/ 12/1  
1        甲       语文        98                   90               98
1        甲       数学        80                  80                83
1        甲        英语       60                60                  60
2        乙      语文       100               10                   100 
2        乙      数学     40                  42                      45 
2        乙      英语       70                   70                  70  
3        丙      语文       50                    60                       50 
3        丙       数学      20                     20                  90  
3        丙      英语      100                      100                 100

求 SQL语句    先 谢谢了 

 

------解决思路----------------------
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 学号,名字,[科目]'
SELECT @SQL=@SQL+',MAX(CASE WHEN 日期='''+CONVERT(VARCHAR(10),日期,120)+'''THEN [成绩] END)['+CONVERT(VARCHAR(10),日期,120)+']'
FROM TB
GROUP BY 日期
ORDER BY 日期
SET @SQL=@SQL+'FROM(SELECT 日期,学号,名字,''语文''[科目],1 OD,语文[成绩]FROM TB
UNION ALL SELECT 日期,学号,名字,''数学'',2,数学 FROM TB
UNION ALL SELECT 日期,学号,名字,''英语'',3,英语 FROM TB)T
GROUP BY 学号,名字,[科目],OD
ORDER BY 学号,OD'
EXEC(@SQL)
建议动态执行
------解决思路----------------------
if OBJECT_ID('数据') is not null drop table 数据

create table 数据(日期 varchar(10),
                  学号 varchar(5), 
                  名字 varchar(4),
                  语文 numeric(3,0),
                  数学 numeric(3,0),
                  英语 numeric(3,0))
insert into 数据 select '2014/10/1',1,'甲',98,80,60
insert into 数据 select '2014/10/1',2,'甲',100,40,70
insert into 数据 select '2014/10/1',3,'丙',50,20,100
insert into 数据 select '2014/11/1',1,'甲',90,80,60
go
declare @i varchar(8000),@j as varchar(8000)
set @i=''
set @j=''
select @i=@i+',['+日期+']' from 数据 group by 日期
select @j='select * 
from (select 日期,学号,名字,语文 as 成绩,''语文'' as 科目 from 数据 union all
select 日期,学号,名字, 数学 as 成绩,''数学'' as 科目 from 数据 union all
select 日期,学号,名字, 英语 as 成绩,''英文'' as 科目 from 数据) as bb
pivot (sum(成绩) for 日期 in ('+stuff(@i,1,1,'')+')) as bb'

exec(@j)

  相关解决方案