日期:2014-05-17  浏览次数:20443 次

SQL 行转列怎么实现?

假设有张学生排名表(tb)如下:

学期       专业   课程  姓名
第一学期 计算机系 语文  张德
第一学期 计算机系 语文  张三
第一学期 计算机系 数学  李四
第一学期 计算机系 电脑  刘海

第一学期 英语系   语文  张阐
第一学期 英语系   数学  陈明

第一学期 工程系   物理  李王
第一学期 工程系   数学  莉丽

/*
想变成 
姓名           计算机系        英语系    工程系          
----------   ----------- ----------- ----------- 
第一学期  语文   张德       张阐          
第一学期  语文   张三                 
第一学期  数学   李四       陈明         莉丽       
第一学期  电脑   刘海                 
第一学期  物理                           李王

*/


------解决方案--------------------
查看置顶贴就明白了
------解决方案--------------------
引用:
查看置顶贴就明白了


就是这里http://bbs.csdn.net/topics/390035109
------解决方案--------------------
IF OBJECT_ID('TEST')IS NOT NULL
  DROP TABLE TEST
GO

CREATE TABLE TEST(学期 VARCHAR(10),专业 VARCHAR(10),课程 VARCHAR(10),姓名 VARCHAR(10))
INSERT INTO TEST
SELECT '第一学期', '计算机系', '语文', '张德' UNION ALL
SELECT'第一学期', '计算机系' ,'语文' , '张三'UNION ALL
SELECT'第一学期' ,'计算机系' ,'数学' , '李四'UNION ALL
SELECT'第一学期' ,'计算机系', '电脑' , '刘海'UNION ALL

SELECT'第一学期' ,'英语系' ,  '语文' , '张阐'UNION ALL
SELECT'第一学期' ,'英语系' ,  '数学',  '陈明'UNION ALL

SELECT'第一学期', '工程系'   ,'物理'  ,'李王'UNION ALL
SELECT'第一学期' ,'工程系'  , '数学' , '莉丽'

SELECT
A.学期,A.课程,B.姓名 AS '计算机系',C.姓名 AS '英语系',D.姓名 AS '工程系'

FROM( SELECT DISTINCT 学期,课程 FROM TEST) A
LEFT JOIN TEST B ON A.课程  = B.课程 AND B.专业 = '计算机系'
LEFT JOIN TEST C ON A.课程  = C.课程 AND C.专业 = '英语系'
LEFT JOIN TEST D ON A.课程  = D.课程 AND D.专业 = '工程系'


/*
学期         课程         计算机系       英语系        工程系
---------- ---------- ---------- ---------- ----------
第一学期       电脑