经过前几天准备,大概.NET/C#的基础有所掌握了,今天准备一下SQL Server
一、行转列(原文:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html,http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html)
经典的行转列必考题
CREATE TABLE #tab(姓名 VARCHAR(10), 课程 VARCHAR(10), 分数 INT) INSERT INTO #tab VALUES(‘张三‘,‘语文‘,74) INSERT INTO #tab VALUES(‘张三‘,‘数学‘,83) INSERT INTO #tab VALUES(‘张三‘,‘物理‘,93) INSERT INTO #tab VALUES(‘李四‘,‘语文‘,74) INSERT INTO #tab VALUES(‘李四‘,‘数学‘,84) INSERT INTO #tab VALUES(‘李四‘,‘物理‘,94)
姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94
1、原始写法
SELECT 姓名, MAX(CASE 课程 WHEN ‘语文‘ THEN 分数 ELSE 0 END) 语文, MAX(CASE 课程 WHEN ‘数学‘ THEN 分数 ELSE 0 END) 数学, MAX(CASE 课程 WHEN ‘物理‘ THEN 分数 ELSE 0 END) 物理 FROM #tab GROUP BY 姓名
姓名 语文 数学 物理 李四 74 84 94 张三 74 83 93
就是把第一列group by,然后判断每列,是当前列就把要加的那一列值加上,否则加0
2、动态拼接
DECLARE @sql VARCHAR(500) SET @sql=‘SELECT 姓名‘ SELECT @sql=@sql+‘, MAX(CASE 课程 WHEN ‘‘‘+课程+‘‘‘ THEN 分数 ELSE 0 END)[‘+课程+‘]‘ FROM (SELECT DISTINCT 课程 FROM #tab)a SET @sql=@sql+‘ FROM #tab GROUP BY 姓名‘ PRINT(@sql) EXEC(@sql)
PRINT出来的以下语句
SELECT 姓名, MAX(CASE 课程 WHEN ‘数学‘ THEN 分数 ELSE 0 END)[数学], MAX(CASE 课程 WHEN ‘物理‘ THEN 分数 ELSE 0 END)[物理], MAX(CASE 课程 WHEN ‘语文‘ THEN 分数 ELSE 0 END)[语文] FROM #tab GROUP BY 姓名
和第一种是一样的,改进之处在于可以动态生成。
3、PIVOT函数(SQL2005以上支持)
SELECT * FROM #tab PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理) ) a
语法:
PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) )
一句话就搞定,但要记住语法
4、PIVOT动态拼接,懒得弄了,原理一样
二、列转行(原文:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html,http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html)
姓名 语文 数学 物理 李四 74 84 94 张三 74 83 93
1、原始写法
SELECT * FROM ( SELECT 姓名, 课程=‘语文‘, 分数=语文 FROM #tab1 UNION ALL SELECT 姓名, 课程=‘数学‘, 分数=数学 from #tab1 UNION ALL SELECT 姓名, 课程=‘物理‘, 分数=物理 from #tab1 ) t
2、动态拼接(使用系统函数,就不能用临时表了)
DECLARE @sql VARCHAR(8000) SELECT @sql=ISNULL(@sql+‘ UNION ALL ‘,‘‘)+‘ SELECT 姓名, [课程]=‘ +QUOTENAME(Name,‘‘‘‘)+‘ , [分数] = ‘+QUOTENAME(Name)+‘ FROM test2‘ FROM syscolumns WHERE Name!=‘姓名‘ AND ID=OBJECT_ID(‘test2‘) PRINT(@sql) EXEC(@sql)
SELECT 姓名, [课程]=‘数学‘ , [分数] = [数学] FROM test2 UNION ALL
SELECT 姓名, [课程]=‘物理‘ , [分数] = [物理] FROM test2
UNION ALL
SELECT 姓名, [课程]=‘语文‘ , [分数] = [语文] FROM test2
3、UNPIVOT函数
SELECT 姓名, 课程, 分数 FROM test2 UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t
4、UNPIVOT动态拼接,懒得弄了,原理一样
原文:http://www.cnblogs.com/liuyouying/p/5077088.html