在工作中,大家可能会遇到一些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. 【LGR-072】回首过去

    题目   点这里看题目. 分析   可以发现,符合条件的分数约分后,其分母必须为\(2^m5^k\).因此,原分数一定可以表示为: \[\frac{XY}{2^m5^kX} \]   其中\((10, ...

  2. (八)MySQL事务、视图、变量、存储过程、函数、流程控制结构

    补充:增删查改语句在数据库中基本通用,但这篇博客的内容基本是MySQL区别于其它数据库管理系统的知识,也要认真学习. 一.事务 1.含义:在MySQL中,可以通过创建事务来解决一些问题. 2.语法: ...

  3. D2大全

    年初看到cnblogs上有人说看这本旧书,自己也只是瞟了下,后来在看些OOP东西时,想想没事也看看老古董,于是网购了一本电子版可参考下,它们是怎么一步步来,还没来得及多看,贴图于此.

  4. mingw32 exception在sjlj与dwarf差别-反汇编分析

    sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...

  5. docker-mcr 助您全速下载 dotnet 镜像

    2018 年五月之后,微软将后续发布的所有 docker image 都推送到了 MCR (Miscrosoft Container Registry),但在中国大陆,它的速度实在是令人发指,本文将介 ...

  6. 关于单向循环链表的约瑟夫问题(Java实现)

    关于单向循环链表的约瑟夫问题(Java实现) 最近在学习链表时,遇到单向循环链表中的约瑟夫问题.在构建循环链表的代码上,我有一点很不理解,遂记录下来. Josephu问题为: 设编号为1, 2,.. ...

  7. 一个老牌程序员说:做Java开发,怎么可以不会这 20 种类库和 API

  8. int与Integer的区别(基本类型与复杂类型的对比)转

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型. Java中的简单类型从概念上分为四种:实数.整数.字符.布尔值.但是有一点需要说明的是,Java里面只有八种原始类型,其列表如下: 实数: ...

  9. [ 头皮发麻 A1 ] 队内赛3 2020 Ateneo de Manila University DISCS PrO HS Division

    都是英语阅读题 但是本菜鸡就过了一题,直接自闭mmp明天开始起床一版题 传送门 B.Riana and the Blind Date 0是闰年?惊了 后来才知道整除被除数可以为0 闰年的计算方法 \( ...

  10. 尚硅谷spring aop详解

    spring的aop实现我们采用AspectJ的方式来实现,不采用spring框架自带的aop aspect实现有基于注解的方式,有基于xml的方式,首先我们先讲基于注解的方式,再将基于xml的方式 ...