行转列,老生常谈的问题。这里总结一下网上的方法。

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 行转列、字符串行转列、自动生产行转列脚本的更多相关文章

  1. SqlServer 行转列,列转行 以及PIVOT函数快速实现行转列,UNPIVOT实现列转行

     一   .列转行 创建所需的数据 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3 ...

  2. devexpress表格控件gridcontrol设置隔行变色、焦点行颜色、设置(改变)显示值、固定列不移动(附源码)

    介绍一些常用的gridcontrol设置. 1.设置隔行变色.首先设置显示隔行变色,步骤:OptionsView-->EnableAppearanceEvenRow-->true和Opti ...

  3. Pandas: 如何将一列中的文本拆分为多行? | Python

    Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...

  4. C语言:将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边。-在m行m列的二维数组中存放如下规律的数据,

    //将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边. #include <stdio.h> #define M 3 #define N 5 ...

  5. sqlserver数据,将一行某一列字符串的值用“_”分割分别填充到这一行的其他列

    分割字符到列DECLARE @a VARCHAR(10)SET @a ='00G-2-1102'SELECT CHARINDEX('-',@a,CHARINDEX('-',@a))SELECT CHA ...

  6. SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF

    原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...

  7. Clickhouse 字符串拆分 OR 一行转多行

    Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成

  8. sqlserver数据库安全函数、配置函数、游标函数、行级函数、排名函数、元数据函数、系统统计函数 、文本和图像函数--收藏着有用

    行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短 ...

  9. Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

随机推荐

  1. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  2. python网络爬虫之入门[一]

    目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...

  3. 影响ES相关度算分的因素

    相关性算分 指文档与查询语句间的相关度,通过倒排索引可以获取与查询语句相匹配的文档列表   如何将最符合用户查询需求的文档放到前列呢? 本质问题是一个排序的问题,排序的依据是相关性算分,确定倒排索引哪 ...

  4. java path

    static{ String path = new Object(){ public String getPath() { return this.getClass().getResource(&qu ...

  5. NFS介绍、服务端安装配置、NFS配置选项

    6月21日任务 14.1 NFS介绍14.2 NFS服务端安装配置14.3 NFS配置选项 14.1 NFS介绍 14.2 NFS服务端安装配置 1.首先需要2台机器,一台是服务端,一台是客户端,分别 ...

  6. shell中的函数、shell中的数组、告警系统需求分析

    7月16日任务 20.16/20.17 shell中的函数20.18 shell中的数组20.19 告警系统需求分析 20.16/20.17 shell中的函数 函数就是一个子shell就是一个代码段 ...

  7. $("#loginname").tips和jQuery中 的ajax

    jquery tips 提示插件 jquery.tips.js v0.1beta: 使用方法 $("#loginname").tips({ //#loginname为jquery的 ...

  8. 修改python3导致终端打不开

    误操作将/usr/bin/python3文件修改,或者删除,导致终端打不开, 解决办法其实很简单,ctrl+alt+f3进入命令窗口,将python2.7的文件拷贝到python中就可以解决了 sud ...

  9. springboot+微信小程序实现微信支付【统一下单】

    说明: 1)微信支付必须有营业执照才可以申请 2)微信支付官方api是全套的,我这是抽取其中的统一下单api,做了一个简单的封装 首先看看微信支付 商户系统和微信支付系统主要交互: 1.小程序内调用登 ...

  10. PAT甲级专题|最短路

    PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...