--列转行
CREATE TABLE tb(姓名 VARCHAR(10),语文 INT,数学 INT,物理 INT)
INSERT INTO tb VALUES('张三',74,83,93)
INSERT INTO tb VALUES('李四',74,84,94)
select * from tb
--使用静态sql实现
SELECT * FROM
(
SELECT 姓名,课程='语文',分数=语文 FROM tb
UNION ALL
SELECT 姓名,课程='数学',分数=数学 FROM tb
UNION ALL
SELECT 姓名,课程='物理',分数=物理 FROM tb
) t
ORDER BY 姓名,CASE 课程 WHEN '语文' THEN 1 WHEN '数学' THEN 2 WHEN '物理' THEN 3 end
--使用unpivot函数
select 姓名,课程,分数 from tb unpivot ( 分数 for 课程 in ([语文],[数学],[物理]) ) t
--使用动态sql
DECLARE @sql VARCHAR(8000)
SELECT @sql=isnull(@sql+' union all ','')+' select 姓名, [课程]='
+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'
FROM syscolumns
WHERE Name!='姓名' AND ID=object_id('tb')--表名tb,不包含列名为姓名的其他列
ORDER BY colid
exec(@sql+' order by 姓名')
go
select quotename('ab[]cde')