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,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
随机推荐
- H3C交换机console登录配置 v7
一.通过con口只需输入password登陆交换机. [H3C]user-interface aux 0 设置认证方式为密码验证方式 [H3C-ui-aux0] authentication-mode ...
- python3 之 函数传参
一.可变对象与不可变对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象. 不可变类型:变量赋值 a=5 后 ...
- mybatis精讲(四)--ObjectFactory
目录 前言 mybatis的ObjectFactory 源码 setProperties create instantiateClass 使用场景 # 加入战队 微信公众号 前言 ObjectFact ...
- 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
>传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...
- Virtualbox修改虚拟机分配内存的大小
起因:因为虚拟机刚开始分配的内存太小,导致太卡, 解决方法:修改虚拟机分配内存的大小 方法一:必须在关闭ubuntu的前提下进行,否则无法修改 点击设置 系统选项 主板中的内存大小 之后开启即可 方法 ...
- js模块导入/导出大全
说明 module.exports与exports是CommonJS的规范 export与export default是es6规范 require 是 AMD规范引入方式 import是es6的一个语 ...
- 【决战西二旗】|理解Sort算法
前言 前面两篇文章介绍了快速排序的基础知识和优化方向,今天来看一下STL中的sort算法的底层实现和代码技巧. 众所周知STL是借助于模板化来支撑数据结构和算法的通用化,通用化对于C++使用者来说已经 ...
- map.entrySet().iterator()
1.首先创建一个HashMap, Map map= new HashMap(); 2.Iterator iter= map.entrySet().iterator(); 首先是map.entrySet ...
- mac安装numpy,scipy,matplotlib
SaintKings-Mac-mini:~ saintking$ python Python ( , ::) [GCC Compatible Apple LLVM (clang-)] on dar ...
- Docker系列之常用命令操作手册
目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...