在工作中,大家可能会遇到一些SQL列转行、行转列的问题,恰好,我也遇到了,就在此记录一下。此处所用的是SQLServer2008R2。

  行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案来说明一下,分别是case when、PIVOT、For XML。

  列转行:

  首先创建测试数据:

--测试语句,准备创建表的语句:如下
CREATE TABLE dbo.test1
(
id int IDENTITY(1,1) NOT NULL PRIMARY KEY NONCLUSTERED,
typeid nvarchar(50) NULL,
typeName nvarchar(50) NULL,
number int NULL
);
CREATE UNIQUE CLUSTERED INDEX idx_id
ON dbo.test1(id);
--插入测试数据
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S1', '一班',50);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S1', '二班',80);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S1', '三班',60);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S2', '一班',50);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S2', '二班',30);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S2', '三班',60);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S3', '一班',70);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S3', '儿班',80);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S3', '三班',60);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S3', '四班',30);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S4', '一班',90);
INSERT INTO dbo.test1(typeid,typeName,number) VALUES('S4', '二班',50);

  普通的结果:,要实现的效果:

--CASE WHEN
select
SUM(case when typeid='S1' then number end) as S1,
SUM(case when typeid='S2' then number end) as S2,
SUM(case when typeid='S3' then number end) as S3,
SUM(case when typeid='S4' then number end) as S4
from test1
--PIVOT
select *
from (select typeid,number from test1) as test
pivot(sum(number) for typeid in([S1],[S2],[S3],[S4]))as tbl

  行转列:

  首先创建测试数据:

--测试语句,准备创建表的语句:如下
CREATE TABLE dbo.test2
(
id int IDENTITY(1,1) NOT NULL PRIMARY KEY NONCLUSTERED,
typeid nvarchar(50) NULL,
typeName nvarchar(50) NULL,
number int NULL,
number2 int NULL,
number3 int NULL
);
CREATE UNIQUE CLUSTERED INDEX idx2_id
ON dbo.test2(id);
--插入测试数据
INSERT INTO dbo.test2(typeid,typeName,number,number2,number3) VALUES('S1', '一班',50,90,100);
INSERT INTO dbo.test2(typeid,typeName,number,number2,number3) VALUES('S2', '二班',20,64,30);

 —》

  需要将number,number2,number3合并到val列,colName是合并之后的原始列名,val是合并之后原始的值。

--unpivot
select id,typeid,typeName,colName,val
from test2
unpivot(val for colName in([number],[number2],[number3]))as tbl

  至此,SQL的列转行,和行专列已经完成。有什么不对的地方,请大家指正。

SQL列转行,行转列实现的更多相关文章

  1. Sqlserver 列转行 行转列

    sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生 ...

  2. mysql列转行 行转列

    列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...

  3. SQL 横转竖 、竖专横(转载) 列转行 行转列

    普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 想变成(得到如下结果): 姓名 语文 数学 物理 --- ...

  4. sql中的行转列和列转行的问题

    sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) G ...

  5. 老生常谈之SQL Server (行转列,列转行)

    Open the first article 在本文章中主要介绍以下内容: 1.静态行转列 2.静态列转行 3.动态行转列 4.动态列转行 1.静态行转列 --静态的行转列 --新建一个科目成绩表 - ...

  6. Sql 语句收集——行转列

    SQL行转列汇总 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in ...

  7. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  8. SQL Server 动态行转列(轉載)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL, ...

  9. sql语句实现行转列的3种方法实例

    sql语句实现行转列的3种方法实例 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一 ...

  10. Databricks 第11篇:Spark SQL 查询(行转列、列转行、Lateral View、排序)

    本文分享在Azure Databricks中如何实现行转列和列转行. 一,行转列 在分组中,把每个分组中的某一列的数据连接在一起: collect_list:把一个分组中的列合成为数组,数据不去重,格 ...

随机推荐

  1. App接口设计之token的php实现

    为了保证移动端和服务端数据传输相对安全,需要对接口进行加密传输. 一.ttoken的设计目的:  因为APP端没有和PC端一样的session机制,所以无法判断用户是否登陆,以及无法保持用户状态,所以 ...

  2. 实现简易版react中createElement和render方法

    function createElement(type, config, children) { // 1. 创建一个对象 // 2.根据参数config修改这个对象 // 3.把children参数 ...

  3. Arduino控制超声波检测与0.96OLED及串口显示

    Arduino控制超声波检测与0.96OLED及串口显示代码使用库共享(包括超声波检测与U8glib): 使用元件: 0.96寸 12864 I2C OLED 128x64规格 超声波检测模块 湿度模 ...

  4. 这一次搞懂Spring的XML解析原理

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  5. JSR133提案-修复Java内存模型

    目录 1. 什么是内存模型? 2. JSR 133是关于什么的? 3. 再谈指令重排序 4.同步都做了什么? 5. final字段在旧的内存模型中为什么可以改变? 6."初始化安全" ...

  6. C/S C# WPF锐浪报表教程

    前言:锐浪报表是一种中国式报表的报表开发工具.博主使用锐浪报表有一段时间了,积累了一些经验希望能帮助你快速掌握并使用 第一章:集成项目 首先我们先去锐浪报表官网下载并安装锐浪报表. 创建WPF应用程序 ...

  7. ssh生成单个公钥

    ssh生成单个公钥命令: ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 查看公钥: cat ~/.ssh/id_rsa ...

  8. 学习Linux必须掌握的一个知识-i节点

    linux文件系统是Linux系统的心脏部分,提供了层次结构的目录和文件.文件系统将磁盘空间划分为每1024个字节一组,称为块(也有用512字节为一块的,如:SCOXENIX).编号从0到整个磁盘的最 ...

  9. spring boot admin项目的集成和开发

    Spring Boot Admin是一个Github上的一个开源项目,它在Spring Boot Actuator的基础上提供简洁的可视化WEB UI,是用来管理 Spring Boot 应用程序的一 ...

  10. Oracle 11g各种服务作用以及哪些需要开启

    Windwos server 2012 R2上成功安装Oracle 11g后共有7个服务,如果全局数据库名为orcl,则Oracle服务分别为 Oracle ORCL VSSWriter Servic ...