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.专业 = '工程系'
/*
学期 课程 计算机系 英语系 工程系
---------- ---------- ---------- ---------- ----------
第一学期 电脑 刘海 NULL NULL
第一学期 数学 李四 陈明 莉丽
第一学期 物理 NULL NULL 李王
第一学期 语文 张德 张阐 NULL
第一学期 语文 张三 张阐 NULL
*/
--这样会有两个张阐 这个你看行不行吧 。你这个不是行转列
[解决办法]
declare @sql nvarchar(max)
select @sql=isnull(@sql,'')+',max(case when 专业='''+专业+''' then 姓名 else null end)['+专业+']' from (select distinct 专业 from tb)t
exec('select 学期,课程'+@sql+' from tb group by 学期,课程')