sqlserver 行转列、字符串行转列、自动生产行转列脚本
行转列,老生常谈的问题。这里总结一下网上的方法。
1、生成测试数据:
CREATE TABLE human(
name NVARCHAR(5), --姓名
norm NVARCHAR(5), --指标
score INT , --分数
grade NVARCHAR(2) --等级
)
GO
INSERT INTO human(name,norm,score,grade)VALUES
('旺仔','考勤',56,'c'),
('旺仔','生产',85,'b'),
('旺仔','技术',95,'a'),
('小杰','考勤',66,'a'),
('小杰','生产',77,'b'),
('小杰','技术',88,'c'),
('玉红','考勤',92,'j'),
('玉红','生产',73,'k'),
('玉红','技术',81,'m')
查询数据:

注意:这里的score是数值类型列,而grade是字符串类型的列
2、利用case when 语句完成行转列,其中行转列之后的列的属性是数值类型
SELECT
name,
SUM(CASE WHEN norm = '考勤' THEN score ELSE 0 END) AS 考勤,
SUM(CASE WHEN norm = '生产' THEN score ELSE 0 END) AS 生产,
SUM(CASE WHEN norm = '技术' THEN score ELSE 0 END) AS 技术
FROM dbo.human
GROUP BY name
结果:

3、利用case when 语句完成行转列,其中行转列之后的列的属性是字符串类型
又分为两种情况,a:是借用for xml path 拼接字符串,b:巧妙的借用max()函数可以对字符串进行运算的特点进行筛选
a:借用for xml path 拼接字符串
SELECT name ,
( SELECT grade + ''
FROM dbo.human
WHERE name = a.name
AND norm = '考勤'
FOR
XML PATH('')
) AS 考勤 ,
( SELECT grade + ''
FROM dbo.human
WHERE name = a.name
AND norm = '生产'
FOR
XML PATH('')
) AS 生产 ,
( SELECT grade + ''
FROM dbo.human
WHERE name = a.name
AND norm = '技术'
FOR
XML PATH('')
) AS 技术
FROM dbo.human a
GROUP BY name;
结果:

b:巧妙的借用max()(或min())函数可以对字符串进行运算的特点进行筛选
SELECT name ,
MAX( CASE WHEN a.norm = '考勤' THEN a.grade ELSE '' END ) AS 考勤,
MAX( CASE WHEN a.norm = '生产' THEN a.grade ELSE '' END ) AS 生产,
MAX( CASE WHEN a.norm = '技术' THEN a.grade ELSE '' END ) AS 技术
FROM dbo.human a
GROUP BY name;
结果:

3、实际生产过程中会碰到这种情况:norm列的值有很多种情况,比如几十、上百个,难道我们一一手写吗?不,我们可以考虑使用拼接字符串的方式,动态实现行转列
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = 'select name,
'; SELECT @sql = @sql + 'max(case when a.norm = ''' + a.norm
+ ''' then a.grade ELSE '''' END ' + ') as ' + QUOTENAME(a.norm) + ',
'
FROM ( SELECT DISTINCT
norm
FROM dbo.human
) a; SELECT @sql = SUBSTRING(@sql, 1, LEN(@sql) - 3); SELECT @sql = @sql + '
FROM dbo.human a
GROUP BY name;'; SELECT @sql;
EXEC (@sql);
首先观察一下我们自动拼接出来的sql语句:

完美!拼接的语句正式我们所希望的,所以结果也不出所料:

4、pivot新特性实现行转列,针对行转列后,列的属性是数值类型的情况,这里指score
SELECT *
FROM ( SELECT name ,
norm ,
score
FROM dbo.human
) t PIVOT( SUM(score) FOR norm IN ( 考勤, 生产, 技术 ) ) AS pvt;
结果:

5、pivot新特性实现行转列,针对行转列后,列的属性是字符串类型的情况,这里指score
SELECT *
FROM ( SELECT name ,
norm ,
grade
FROM dbo.human
) t PIVOT( MAX(grade) FOR norm IN ( 考勤, 生产, 技术 ) ) AS pvt;

6、同理,我们也可以通过拼接字符串的形式来组织pivot语句生成自动行转列的脚本。好动手的童鞋赶快动起来吧。
如果您有疑问,欢迎评论区交流讨论
sqlserver 行转列、字符串行转列、自动生产行转列脚本的更多相关文章
- SqlServer 行转列,列转行 以及PIVOT函数快速实现行转列,UNPIVOT实现列转行
一 .列转行 创建所需的数据 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3 ...
- devexpress表格控件gridcontrol设置隔行变色、焦点行颜色、设置(改变)显示值、固定列不移动(附源码)
介绍一些常用的gridcontrol设置. 1.设置隔行变色.首先设置显示隔行变色,步骤:OptionsView-->EnableAppearanceEvenRow-->true和Opti ...
- Pandas: 如何将一列中的文本拆分为多行? | Python
Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...
- C语言:将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边。-在m行m列的二维数组中存放如下规律的数据,
//将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边. #include <stdio.h> #define M 3 #define N 5 ...
- sqlserver数据,将一行某一列字符串的值用“_”分割分别填充到这一行的其他列
分割字符到列DECLARE @a VARCHAR(10)SET @a ='00G-2-1102'SELECT CHARINDEX('-',@a,CHARINDEX('-',@a))SELECT CHA ...
- SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF
原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...
- Clickhouse 字符串拆分 OR 一行转多行
Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成
- sqlserver数据库安全函数、配置函数、游标函数、行级函数、排名函数、元数据函数、系统统计函数 、文本和图像函数--收藏着有用
行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短 ...
- Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录
第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
随机推荐
- java.lang.String 的 + 号操作到底做了什么事情?
前言 在之前的面试经历中,对于String的考察还是挺频繁的,大致考察以下几个知识点: String 常量池 new String() == 和 equals 的区别 native 方法 Strin ...
- 使用zuul实现验证自定义请求头中的token
路由:她会把外部所有对请求转发到具体的微服务实例上,是实现外部访问同一接口的基础 过滤: 就是权限的检查, 判断当前的请求是否有权限区访问那些服务集群 搭建后台网关: 导入eureka - clien ...
- 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)
钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...
- C#学习笔记03--循环和一维数组
一.循环(重点) 什么时候用循环? 想让一段代码执行多次, 这段代码可能不一样但是一定有一个规律. 1.while 循环 格式: while(循环条件) { 循环执行的代码; } 循环的机制: 当 ...
- 1sql
------------------ MySQL 服务-- sudo service mysql start/stop/restart/status ------------------ 数据库相关的 ...
- C#异步案例一则
场景 生产者和消费者队列, 生产者有多个, 消费者也有多个, 生产到消费需要异步. 下面用一个Asp.NetCore Web-API项目来模拟 创建两个API, 一个Get(), 一个Set(), G ...
- Java的证书:HTTPS与SSL
在取得connection的时候和正常浏览器访问一样,仍然会验证服务端的证书是否被信任(权威机构发行或者被权威机构签名):如果服务端证书不被信任,则默认的实现就会有问题,一般来说,java在访问ssl ...
- 小白都会用的免配置 Aria2 图形界面版免费开源下载软件PDM
如今的迅雷真的越发让人失望,好好的下载软件变成了广告浏览器,最近又关停了“远程下载”功能,就算花钱加入会员,很多资源现在也不允许下载了,鸡肋的很. 然而除了 IDM.Folx.qBitorrent 等 ...
- spring boot 一个项目启动多个实例
0.前言 在开发中,我们经常需要以不同端口启动同一个项目的多个实例,IDEA中启动多个实例很简单 1.方法 1.1.在项目中,选择编辑配置,然后点选允许并行运行,如下图: 1.2.调出RunDashb ...
- HOOK的类型