有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的。

如下:

declare @t table
(StudentName nvarchar(20),
Subject nvarchar(20),
Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 );
Insert into @t (StudentName,Subject,Score) values ( '学生A', '数学', 78 );
Insert into @t (StudentName,Subject,Score) values ( '学生A', '英语', 92 );
Insert into @t (StudentName,Subject,Score) values ( '学生B', '中文', 89 );
Insert into @t (StudentName,Subject,Score) values ( '学生B', '数学', 87 );
Insert into @t (StudentName,Subject,Score) values ( '学生B', '英语', 75 );
Insert into @t (StudentName,Subject,Score) values ( '学生C', '中文', 92 );
Insert into @t (StudentName,Subject,Score) values ( '学生C', '数学', 74 );
Insert into @t (StudentName,Subject,Score) values ( '学生C', '英语', 65 );
Insert into @t (StudentName,Subject,Score) values ( '学生D', '中文', 79 );
Insert into @t (StudentName,Subject,Score) values ( '学生D', '数学', 83 );
Insert into @t (StudentName,Subject,Score) values ( '学生D', '英语', 81 );
Insert into @t (StudentName,Subject,Score) values ( '学生E', '中文', 73 );
Insert into @t (StudentName,Subject,Score) values ( '学生E', '数学', 84 );
Insert into @t (StudentName,Subject,Score) values ( '学生E', '英语', 93 );
Insert into @t (StudentName,Subject,Score) values ( '学生F', '中文', 79 );
Insert into @t (StudentName,Subject,Score) values ( '学生F', '数学', 86 );
Insert into @t (StudentName,Subject,Score) values ( '学生F', '英语', 84 ); select StudentName,
sum(case when Subject = N'中文' then Score else 0 end) Chinese,
sum(case when Subject = N'数学' then Score else 0 end) Math,
sum(case when Subject = N'英语' then Score else 0 end) Engilsh
from @t
group by StudentName

今天看到一个新的写法,pivot 可以实现相同的功能(2005才开始支持)。

pivot 的语法为:

table_source

pivot(聚合函数(value_column) pivot_column for (columnlist))

稍微解释一下:

table_source: 是我们要进行转换的表。pivot_column: 就是要进行行转列的列名。value_column:是转换后列的值。columnlist 是要生成的列。

同样是上面的例子,使用pivot 可以这样写得到同样的结果:

select StudentName,
[中文] Chinese,
[数学] Math,
[英语] English
from
(select * from @t) t1
pivot (sum(Score) for Subject in([中文],[英语],[数学])) t2

与之对应的 unpivot 就是列转行了(列名作为值),

unpivot 的语法为:

table_source

unpivot(value_column ubpivot_column for(columnlist))

参数的意义与pivot 是一样的。这里我们可以简单的把刚刚转后的再转回去,这样就得到原来的表了:

select StudentName,
Subject,
Score
from
(select * from @t) t1
pivot (sum(Score) for Subject in([中文],[英语],[数学])) t2
unpivot (Score for Subject in([中文],[英语],[数学])) t3

sql server pivot/unpivot 行列互转的更多相关文章

  1. 使用SQL SERVER PIVOT实现行列转置

    一般我们在使用SQL语句实现行列转置时候,最常用的方法无外乎就是 case语句来实现,但是如果需要需要转置的列太多,那么case起来语句就无限庞大,十分不方便,sql server中的PIVOT就可以 ...

  2. sql:pivot unpivot

    pivot  行转列 unpivot  列转行 源码跑步起来 这是能跑起来的 源码转自 http://www.cnblogs.com/zhangzt/archive/2010/07/29/178782 ...

  3. 行转列:SQL SERVER PIVOT与用法解释

    在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一 ...

  4. SQL SERVER 中的行列转换小结

    1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...

  5. SQL SERVER PIVOT与用法解释

    通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK ),I ...

  6. SQL Server pivot 行转列遇到的问题

    前段时间开发系统时,有个功能是动态加载列,于是就使用了SQL Server自带的PIVOT函数进行行转列,开始用的非常溜,效果非常好.但是提交测试后问题来了,测试添加的列名中包含空格,然后就杯具了,功 ...

  7. SQL SERVER PIVOT使用

    参照这个网址介绍 http://www.cnblogs.com/lwhkdash/archive/2012/06/26/2562979.html 一般SQL Server的函数都会识别为紫色,可是PI ...

  8. SQL SERVER pivot(行转列),unpivot(列转行)

    [pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...

  9. 2019-03-28 SQL Server Pivot

    --现在我们是用PIVOT函数将列[WEEK]的行值转换为列,并使用聚合函数Count(TotalPrice)来统计每一个Week列在转换前有多少行数据,语句如下所示 select * from Sh ...

随机推荐

  1. CSS3的自定义动画帧

    CSS3新增的动画帧非常绚丽,可以简单实现一些动画效果,目前除IE外各大主流浏览器都支持 本文演示三个:transform: scale3d(x, y, z)-缩放;.transform: trans ...

  2. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q109-Q111)

    Question  109  Your company uses a third-party service to host its SharePoint 2010 site. The hosting ...

  3. IOS开发基础知识--碎片4

    十七:返回到主线程进行操作,对UI进行更新只能在主线程进行 /*将数据显示到UI控件,注意只能在主线程中更新UI, 另外performSelectorOnMainThread方法是NSObject的分 ...

  4. IOS开发基础知识--碎片9

    1:两种方法删除NSUserDefaults所有记录 //方法一 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[N ...

  5. CoreData的一些简单运用

    1.首先创建一个新的工程 记得勾选下面的 Use Core Data 万恶分割线———————————————————————— 然后点击Add Entity 创建一个类似于表名. 万恶分割线———— ...

  6. Mac使用极简教程

    最近领导让我写一篇关于Mac的使用教程,因为使用人群未知,所以尽量写的通俗易懂,可谓是关于Mac电脑使用的精简教程吧,在此发表出来以供参考. Mac因为安全性而闻名,我们拥有了一部Mac,那么我们来了 ...

  7. 使用DOTNETZIP过滤并压缩相对目录

    业务要求: 压缩某个文件夹及其子目录 压缩时只压缩指定的文件类型,如cshtml 压缩后保持相对目录   找了很久,没有直接的DEMO,最后尝试通过以下代码完成 示例演示了只压缩cshtml和js,同 ...

  8. TNS-12518 & Linux Error:32:Broken pipe

    最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl servi ...

  9. backup, file manipulation operations (such as ALTER DATABASE ADD FILE) and encryption changes on a database must be serialized.

    昨天在检查YourSQLDba备份时,发现有台数据库做备份时出现了下面错误信息,如下所示: <Exec>   <ctx>yMaint.ShrinkLog</ctx> ...

  10. Jquery操作cookie,实现简单的记住用户名的操作

     一.jquery.cookie.js介绍  jquery.cookie.js是一个基于jquery的插件,一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cook ...