有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 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. jQuery拉开关闭帷幕

    查看效果:http://keleyi.com/keleyi/phtml/jqtexiao/7.htm HTML文件代码: <!DOCTYPE html PUBLIC "-//W3C// ...

  2. 钉钉js依赖库学习

    看别人用的依赖库的好处在于,你知道有什么可以用,什么可以借鉴.(钉钉——协作桌面应用) PS:人最怕是不知道,而不是你不会. 1. jQuery 钉钉使用了1.9.1版本的jQuery,jQuery作 ...

  3. [转]使用Jenkins搭建持续集成(CI)环境

    转自:魔のkyo的工作室 首先从官网http://jenkins-ci.org/下载 Java Web Archive (.war) 例如我保存到 D:\jenkins\jenkins.war 运行J ...

  4. Linux系统NFS网络文件系统

    Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...

  5. Android开发—已root的手机获取data路径

    开发android的时候,尽管手机已经root但是DDMS中还是没有data/data路径怎么办? 可以用cmd命令提示符为逐个文件夹设置权限: 打开cmd,输入 adb shell  回车—> ...

  6. IOS开发基础知识--碎片27

    1:iOS中的round/ceil/floorf extern float ceilf(float); extern double ceil(double); extern long double c ...

  7. 支付宝alipay使用小结 调用支付宝程序被杀死说明

    一. 准备阶段 如果没有蚂蚁金服开放平台的注册账号,则需要实现注册一个,这里多说一点,就是当我们以公司名义注册账号时,需要预备公司的营业执照等物品(需要上传照片等信息审核).账号申请成功之后,我们需要 ...

  8. SQLite浅析

    对于iOS工程师有一道常考的面试题,即iOS数据存储的方式 标答如下: Plist(NSArray\NSDictionary) Preference (偏好设置\NSUserDefaults) NSC ...

  9. Python聊天室

    小编心语:锵锵锵!各位看官注意了啊,走过路过表错过!上篇博文主要介绍了基于基于Server-Sent Event的简单在线聊天室,相信不管各位是大牛.小牛还是跟小编一样的小白,可能觉得看得不够过瘾,区 ...

  10. Linux平台卸载MySQL总结

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...