数据库:SQLServer 实现行转列、列转行用法笔记

在许多的互联网项目当中,报表开发是整个项目当中很重要的一个功能模块。其中会有一些比较复杂的报表统计需要行转列或者列转行的需求。今天给大家简单介绍一下在SQLServer当中如何使用PIVOT、UNPIVOT内置函数实现数据报表的行转列、列转行。有需要的朋友可以一起学习一下。

一、PIVOT、UNPIVOT用途

官方解释:可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

注意:UNPIVOT运算符通过将列旋转到行来执行PIVOT的反向操作,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。另外,UNPIVOT 输入中的 NULL 值也在输出中消失了。如果值消失,表明在执行 PIVOT 操作前,输入中可能就已存在原始 NULL 值。

二、PIVOT语法格式

SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

    [第二个透视的列] AS <列名称>,

    ...

    [最后一个透视的列] AS <列名称>,

FROM

    (<生成数据的 SELECT 查询>)

    AS <源查询的别名>

PIVOT

(

    <聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

    IN ( [第一个透视的列], [第二个透视的列],

    ... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;

三、行转列示例说明

-- 创建测试表 学习成绩统计表
CREATE  TABLE ScoreStatistics
(UserName         NVARCHAR(20),        --学生姓名SubjectName       NVARCHAR(30),        --科目名称Score            FLOAT,               --成绩
)
-- 插入测试数据
INSERT INTO ScoreStatistics SELECT '小王', '语文', 100
INSERT INTO ScoreStatistics SELECT '小王', '数学', 90.5
INSERT INTO ScoreStatistics SELECT '小王', '英语', 88
INSERT INTO ScoreStatistics SELECT '小王', '历史', 65
INSERT INTO ScoreStatistics SELECT '小李', '语文', 81
INSERT INTO ScoreStatistics SELECT '小李', '数学', 99
INSERT INTO ScoreStatistics SELECT '小李', '英语', 95
INSERT INTO ScoreStatistics SELECT '小李', '历史', 90
INSERT INTO ScoreStatistics SELECT '小刘', '语文', 90
INSERT INTO ScoreStatistics SELECT '小刘', '数学', 85
INSERT INTO ScoreStatistics SELECT '小刘', '英语', 59
INSERT INTO ScoreStatistics SELECT '小刘', '历史', 98
-- 传统写法
select UserName,max(case SubjectName when '语文' then Score else 0 end)语文,max(case SubjectName when '数学'then Score else 0 end)数学,max(case SubjectName when '英语'then Score else 0 end)英语,max(case SubjectName when '历史'then Score else 0 end)历史
from ScoreStatistics
group by UserName
-- PIVOT 写法更简洁
SELECT * FROM ScoreStatistics
AS P
PIVOT
(SUM(Score/*行转列后 列的值*/) FORp.SubjectName/*需要行转列的列*/ IN ([语文],[数学],[英语],历史/*列的值*/)
) AS T
-- order by 语文 desc  具体科目排序
-- order by username desc -- 姓名排序
-- 动态拼接列的示例
DECLARE @sql_str VARCHAR(8000); -- 要执行的sql
--拿到数值列 [历史],[数学],[英语],[语文]
DECLARE @sql_col VARCHAR(8000);
SELECT @sql_col = ISNULL(@sql_col + ',','') 
+ QUOTENAME(SubjectName) 
FROM ScoreStatistics GROUP BY SubjectName;
print(@sql_col); -- 打印数值列,不必需
SET @sql_str = '
SELECT * FROM (
SELECT [UserName],[SubjectName],[Score] FROM [ScoreStatistics]) 
p PIVOT
(SUM([Score]) FOR [SubjectName] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.[UserName]'
PRINT (@sql_str);--打印执行的sql
EXEC (@sql_str);-- 执行查询

输出结果

UserName 语文 数学 英语 历史

小王 100 90.5 88 65

小刘 90 85 59 98

小李 81 99 95 90

四、列转行示例

-- 插入测试表CREATE  TABLE ScoreSummary(   UserName         NVARCHAR(20),        --学生姓名   数学        FLOAT,               --数学成绩   英语             FLOAT,               --英语成绩   语文             FLOAT,               --语文成绩   历史             FLOAT,               --历史成绩)-- 插入测试数据INSERT INTO ScoreSummary SELECT '小李',81,99,95,90;INSERT INTO ScoreSummary SELECT '小刘',90,85,59,98;INSERT INTO ScoreSummary SELECT '小王',100,90.5,88,65;-- 查询用法select aa.UserName,aa.Scorefrom (select UserName,数学,英语,语文,历史 from dbo.ScoreSummary) as aunpivot(Score for ScoreSummary in(数学,英语,语文,历史)) as aa order by aa.UserName
输出结果:

UserName Score

小李 81

小李 99

小李 95

小李 90

小刘 90

小刘 85

小刘 59

小刘 98

小王 100

小王 90.5

小王 88

小王 65

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐 SQL常用语句大全(值得收藏) 办公技巧:常用的100个Word快捷键! GitHub上值得收藏的100个精选前端项目! 数据库优化:SQL 查找是否"存在",别再 count 了,很耗费时间的! 学习 MySQL 高性能优化原理,这一篇就够了! MySQL优化:数据量很大,分页查询很慢,有什么优化方案? 数据库:MySQL中,当update修改数据与原数据相同时会再次执行吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件知识:串口通讯的起始、数据、停止位是怎么分配的?

串口是串行接口&#xff08;serial port&#xff09;的简称&#xff0c;也称为串行通信接口或COM接口。串口通信是指采用串行通信协议&#xff08;serial communication&#xff09;在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分…

ES5 getter setter

最近在学习vuejs&#xff0c;了解到内部实现使用到了es5的Getters和Setters。之前看高程的时候&#xff0c;没有重视这块&#xff0c;今天查看一下文档&#xff0c;了解了他们的作用&#xff0c;再次记录一下&#xff0c;可供以后查看和共享。 定义Getters和Setters&#xff1a…

python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!

近几年 Python 非常热门&#xff0c;在学术界和产业界的使用率显著提高。目前学习Python的人数日益增多&#xff0c;Python在近3年的编程语言受欢迎度中一直处于榜首。今天我们就来讲讲在产业界&#xff0c;需要具备哪些能力才能获得一个满意的 Python 相关岗位 Offer。Python基…

多线程售票demo,用ReentrantLock实现

代码: public class TicketReentLockDemo implements Runnable {private int ticketTotal 100;private Lock lock new ReentrantLock();Overridepublic void run() {while (ticketTotal > 0) {try {lock.lock();if (ticketTotal > 0) {try {TimeUnit.MILLISECONDS.sle…

数据库:SQLServer中in和 exists函数用法笔记

今天给大家分享一下SQLServer中in和 exists 用法&#xff0c;希望能对大家有所帮助。一、IN 用法确定指定的值是否与子查询或列表中的数据相匹配。1.1 语法格式test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )1.2 参数说明test_expression为任意有…

什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树

前几天下班回到家后正在处理一个白天没解决的bug&#xff0c;厕所突然传来对象的声音&#xff1a; 对象&#xff1a;xx&#xff0c;你有《时间简史》吗&#xff1f; 我&#xff1a;我去&#xff01;妹子&#xff0c;你这啥癖好啊&#xff0c;我有时间也不会去捡屎啊&#xff01…

可重入锁是什么和demo

可重入锁 reentrantlock是独占锁且可重入的 synchronized 也可以重入 可重入意思就是这个线程已经获取锁了&#xff0c;你再获取该锁还能获取 获取的还是原来的锁 不会出现问题 可以降低编程难度 代码如下: new Thread(new Runnable() {Overridepublic void run() {synchr…

linux 安装python 3.x,Linux 安装python3.x步骤

本文转发自博客园非真的文章&#xff0c;内容略有改动linux系统本身默认安装有2.x版本的python&#xff0c;版本x根据不同版本系统有所不同&#xff0c;通过python --V 或 python --version 查看系统自带的python版本。有一些系统命令时需要用到python2&#xff0c;不能卸载&am…

数据库:SQLServer中游标的用法笔记

一、游标的概念知识游标可以理解为SQL Server的一种数据访问机制&#xff0c;它允许用户访问数据的维度是数据行。用户可以对每一行数据进行单独处理&#xff0c;从而降低系统开销和潜在的阻隔情况&#xff0c;游标主要用于存储过程&#xff0c;触发器和 T_SQL复杂的脚本中&…

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉…

智慧政务解决方案(28页)pdf_【金众电子】智慧政务解决方案

智慧政务解决方案立式党建广告机广告机简介&#xff1a;KC-立式政务广告机(室内/室外可选)液晶屏幕特别卖点&#xff1a;安装简易、亮度调节、实时更新、传输安全应用场所&#xff1a;各种需要文化传播的政务机构、政府机关、会议场所等。双立柱政务文化栏/宣传栏文化栏简介&am…

笨办法学linux dhcp,了解网关、DNS、子网掩码、MAC地址、DHCP

原标题&#xff1a;了解网关、DNS、子网掩码、MAC地址、DHCP什么是网关、DNS、子网掩码&#xff0c;它有什么作用&#xff0c;确实&#xff0c;我们平时在网络中总是在不断的提到网关&#xff0c;却很少真正的去了解它。一、什么是网关1、什么是网关网关是一种充当转换重任的计…

数据库:SQLServer Stuff 函数用法笔记

今天小编给大家分享一下自己整理一下SQLServer Stuff函数用法技巧和常用示例&#xff0c;有需要的朋友可以学习一下。一、Stuff函数的作用1.1官方解释STUFF 函数将字符串插入到另一个字符串中。 它从第一个字符串的开始位置删除指定长度的字符&#xff1b;然后将第二个字符串插…

自定义注解,aop实现注解锁

多线程环境下&#xff0c;会出现线程不安全的问题&#xff0c;所以要对某些方法加锁以保证线程安全 但是如果方法过多&#xff0c;每个方法前后都加这么一句&#xff0c;有点麻烦了&#xff0c;而且代码可读性也会差一些。可以使用aop切面编程&#xff0c;对某些加有特定注解&…

手机端刷recovery工具_MIUI/REDMIN手机玩机汇集

愿你刷机半生归来仍是MIUI1解锁篇解锁Bootloader准备工作&#xff1a;1.手机备份数据2.手机进入开发者模式①进入“设置 -> 我的设备 -> 全部参数"中连续点击MIUI版本&#xff0c;进入”开发者模式“②进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和…

数据结构基础:线性表学习笔记

1、线性表定义线性表是指n个元素的有限序列(n>0),通常用(a1,a2,a3...,an),来表示。2、线性表特点1、存在唯一的一个首元素2、存在唯一一个尾元素3、除第首元素外&#xff0c;每个元素只有一个直接前驱。4、除尾元素外&#xff0c;每个元素只有一个直接后继。3、线性表的存储…

iphone导出照片到电脑_iPhone里的照片如何快速导入电脑

前几日我一好友发微信问我&#xff1a;“向阳&#xff0c;我手机里有一万多张照片&#xff0c;怎么能快速的备份到电脑里&#xff1f;”我一看这问题&#xff0c;确实很多果友从用苹果手机开始&#xff0c;机器已经更新换代了好多代了&#xff0c;照片是越来越多&#xff0c;内…

数据结构基础:栈和队列学习笔记

1、栈1.1 栈的定义栈是只能通过访问它的一端来实现数据的存储和检索的一种特殊的线性数据结构。栈的修改要遵循先进后出的原则&#xff0c;这个是栈的核心。在栈中进行插入和删除操作的一端称为栈顶&#xff08;Top&#xff09;。另一端被称为栈底&#xff08;bottom&#xff0…

idea @Autowired 注入爆红(无法注入)

问题如下图所示,idea Autowired 注入爆红(无法注入) seettings ----> Editor Inspactions ----->spring ---->spring Core ----> Code ----> Autowring for Bean Class 去掉那个勾 效果如下