首页 > 数据库技术 > 详细

SQL Server笔试准备 Day1

时间:2015-12-25 22:30:44      阅读:221      评论:0      收藏:0      [点我收藏+]

经过前几天准备,大概.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动态拼接,懒得弄了,原理一样

 

SQL Server笔试准备 Day1

原文:http://www.cnblogs.com/liuyouying/p/5077088.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!