SQL列转行,行转列实现
在工作中,大家可能会遇到一些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列转行,行转列实现的更多相关文章
- Sqlserver 列转行 行转列
sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生 ...
- mysql列转行 行转列
列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...
- SQL 横转竖 、竖专横(转载) 列转行 行转列
普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 想变成(得到如下结果): 姓名 语文 数学 物理 --- ...
- sql中的行转列和列转行的问题
sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题 简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) G ...
- 老生常谈之SQL Server (行转列,列转行)
Open the first article 在本文章中主要介绍以下内容: 1.静态行转列 2.静态列转行 3.动态行转列 4.动态列转行 1.静态行转列 --静态的行转列 --新建一个科目成绩表 - ...
- Sql 语句收集——行转列
SQL行转列汇总 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in ...
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- SQL Server 动态行转列(轉載)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL, ...
- sql语句实现行转列的3种方法实例
sql语句实现行转列的3种方法实例 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一 ...
- Databricks 第11篇:Spark SQL 查询(行转列、列转行、Lateral View、排序)
本文分享在Azure Databricks中如何实现行转列和列转行. 一,行转列 在分组中,把每个分组中的某一列的数据连接在一起: collect_list:把一个分组中的列合成为数组,数据不去重,格 ...
随机推荐
- Base-64字符串无效,The input is not a valid Base-64 string as it contains a non-base 64 character
base64规则: * 字符串只可能包含A-Z,a-z,0-9,+,/,=字符* 字符串长度是4的倍数* =只会出现在字符串最后,可能没有或者一个等号或者两个等号 首先,C# 做上传文件的时候,需要替 ...
- CenterOS7 修改 SSH 端口
首先修改 /etc/ssh/sshd_config 文件中的 Port.修改前一定要备份 可以同时启用多个Port所以最好先追加一个端口,新端口校验没问题之后再把原端口删除 防火墙设置 # 永久开放端 ...
- 软光栅-uraster代码阅读(入门极品)
软光栅-uraster代码阅读(入门极品) 代码链接:https://github.com/Steve132/uraster 所有的代码都在uraster.hpp中.代码非常简单,适合初学者学习软光栅 ...
- 在CentOS8下利用seafile软件搭建私有云
一.安装前准备工作 1. 安装EPEL源 EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用 ...
- Quartz.Net系列(四):Quartz五大构件(Scheduler,Job,Trigger,ThreadPool、JobStore)之ThreadPool、JobStore解析
整体示意图: 1.DefaultThreadPool 如果不存在PropertyThreadPoolType,那么就使用DefaultThreadPool var threadPoolTypeStri ...
- 关联函数-web_reg_save_param
int web_reg_save_param(const char *ParamName,<List of Attributes>,LAST) 返回值:成功时返回LR_PASS,失败时返回 ...
- Spring Boot 在启动时进行配置文件加解密
Spring Boot Application 事件和监听器 寻找到application.yml的读取的操作. 从spring.factories 中查看到 # Application Listen ...
- VScode快捷键集锦(持续更新)
本文的快捷键是根据VScode for mac来的,Windows和Linux用户可能需要些许改动. 注释:cmd + / 注释当前选中的行,或者注释掉选中的行,再按一次反注释.还可以在按cmd + ...
- Java二次复习笔记(1)
Java二次复习笔记(1) Java采用的默认字符编码集是Unicode. byte=byte+byte报错,值为int,而byte+=byte不报错.同样short = short+short报错, ...
- 你想不到的沙雕,10行代码Python实现GIF图倒放,每天的快乐源泉
前言 GIF图现在已经融入了我们的日常网络生活,微信群.QQ群.朋友圈......一言不合就斗图,你怕了吗?不用担心,只要学会了Python之GIF倒放技能,你就是“斗图王”. 咱们直接开始本文的内容 ...