行转列

创建语句:

create table test1(id int identity(1,1) not null,name varchar(255) null,course varchar(255) null,score int null,
)insert into test1(name, course, score) values ('张三','语文', 80)
insert into test1(name, course, score) values ('张三','数学', 52)
insert into test1(name, course, score) values ('张三','英语', 150)
insert into test1(name, course, score) values ('李四','语文', 44)
insert into test1(name, course, score) values ('李四','数学', 111)
insert into test1(name, course, score) values ('李四','英语', 110)
insert into test1(name, course, score) values ('王五','语文', 140)
insert into test1(name, course, score) values ('王五','数学', 80)
insert into test1(name, course, score) values ('王五','英语', 92)
insert into test1(name, course, score) values ('王五','物理', 77)
insert into test1(name, course, score) values ('王五','化学', 65)

原始数据:

1、第一种方法:

-- 使用case when then else ,这里也可以使用sum函数
select name,
max(case course when '语文' then score else 0 end) as chinese,
max(case course when '数学' then score else 0 end) as math,
max(case course when '英语' then score else 0 end) as english,
max(case course when '物理' then score else 0 end) as wuli,
max(case course when '化学' then score else 0 end) as huaxue
from test1 group by name

第一种结果:

2、第二种方法

-- 使用pivot函数行转列
select name,max(t.语文)as chinese,max(t.数学)as math,max(t.英语)as english,max(t.物理)as wuli,max(t.化学)as huaxue
from test1  pivot(max(score) for course in(语文,数学,英语,物理,化学))t
group by name

第二种结果:

3、第三种方法:
有两种写法:

-- 第一种写法,动态sql拼接,有多少行可以进行动态拼接sql,在列不确定的情况下可以使用
declare @sql_str varchar(8000); -- 要执行的sql
declare @sql_col varchar(8000);
select @sql_col = isnull(@sql_col + ',','') + quotename(course)
from test1 group by course;
print(@sql_col); -- 打印数值列,不必需
set @sql_str = 'select * from (select name,course,score from test1)p pivot(sum(score) for course IN ( '+ @sql_col +'))as pvt order by pvt.name'
print (@sql_str);--打印执行的sql
exec (@sql_str);-- 执行查询--第二种写法
declare @name varchar(100);
declare @max varchar(1000);
declare @sql nvarchar(4000);
select @name= stuff(
(select ','+course+'' from test1  group by course  for xml path('')),1,1,'');
select @max= stuff(
(select ',max('+course+') as '+course+'' from test1 group by course for xml path('')),1,1,'');
set @sql='select name,'+@max+' from test1 pivot (max(score) for course in('+@name+')) css   group by name';
exec(@sql);

第三种结果:
两种写法都是一样的结果

4、第四种方法:

-- 使用distinct
select distinct  a.name,
(select score from test1 b where a.name=b.name and b.course='语文' ) as 'chinese',
(select score from test1 b where a.name=b.name and b.course='数学' ) as 'math',
(select score from test1 b where a.name=b.name and b.course='英语' ) as 'english',
(select score from test1 b where a.name=b.name and b.course='物理' ) as 'wuli',
(select score from test1 b where a.name=b.name and b.course='化学' ) as 'huaxue'
from test1 a

第四种结果:

列转行

创建语句:

create table test2(id int identity(1,1) not null,name varchar(255) null,chinese int null,math int null,english int null,wuli int null,huaxue int null
) insert into test2(name,chinese,math,english,wuli,huaxue) values ('张三',110,120,85,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('李四',130,88,89,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('王五',93,124,87,98,67);

原始数据:

第一种方法:
union all与union的区别:
union all对结果集不会去除重复的结果,union会去除重复的结果

--第一种写法:
select row_number() over(order by id desc) as id,name,t.course,t.score from(select id,name,course='语文',score=chinese from test2 union allselect id,name,course='数学',score=math from test2 union allselect id,name,course='英语',score=english from test2 union allselect id,name,course='物理',score=wuli from test2 union allselect id,name,course='化学',score=huaxue from test2
) t where score is not null order by id asc
-- 下面可以不用执行,执行上面即可
,case t.course when '语文' then 1 when '数学' then 2 when '英语' then 3 when '物理' then 4 when '化学' then 5 end-- 第二种写法:
select row_number() over(order by id desc) as id,name,t.course,t.score from(select id,name,'语文' as course, chinese as 'score' from test2 union select id,name,'数学' as course, math as 'score' from test2 union select id,name,'英语' as course, english as 'score' from test2 union select id,name,'物理' as course, wuli as 'score' from test2 union select id,name,'化学' as course, huaxue as 'score' from test2
) t where score is not null order by id asc
-- 下面可以不用执行,执行上面即可
,case t.course when '语文' then 1 when '数学' then 2 when '英语' then 3 when '物理' then 4 when '化学' then 5 end

第一种结果:
两种写法结果都是一样的

2、第二种方法:

--使用unpivot进行列转行
select row_number() over(order by id desc) as id,name,score,course from test2 unpivot( score for course  in(chinese,math,english,wuli,huaxue))a

第二种结果:

SqlServer行转列列转行相关推荐

  1. sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行

    Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...

  2. sqlserver 行转列

    还写了一篇Linq 实现 DataTable 行转列有时间大家可以看一下 sqlserver把行转成列在我们编码中是经常遇到的我做一个小例子大家看一下 1 --创建一个表 2 create table ...

  3. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...

  4. Hive(行转列 列转行)

    Hive(行转列 列转行) 行转列 行专列常用的几种方式有 collect_list collect_set 举例说明 原数据 sql SELECT concat_ws("|",c ...

  5. 【Excel】行转列+列转行

    行转列举例: 拷贝要转成列的行 选择一个空格,右键 选择性粘贴,并勾选 转置 结果如下: 多行转多列 以及多列转多行都是同样的操作

  6. oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  7. Oracle 多行变一列的方法

    多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat ...

  8. oracle 行转列后列名,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  9. greenplum 数据库如何增加列_Greenplum行存与列存的选择以及转换方法-阿里云开发者社区...

    背景 数据在数据库中的存储形式多种多样,比较常见的如 1. PostgreSQL的堆表,以行的形式存储,(当变成字段压缩后的长度超过数据块的四分之一时,会以TOAST的形式存储到TOAST表). 2. ...

  10. 两个列向量相乘怎么计算_矩阵:行主序、列主序、行向量、列向量

    看龙书的时候发现一个矩阵在传入Shader之前都要转置一下,很好奇为什么要有一步这样的操作. 行主序和列主序 行主序指矩阵在内存中逐行存储,列主序指矩阵在内存中逐列存储. 行主序矩阵内存布局: 列主序 ...

最新文章

  1. 计算机内存不足提示栻框,【计算机】计算机文化基础.ppt
  2. 推荐一些优秀的JavaScript开发框架
  3. 我的Git使用-资料查询,名博笔记
  4. druid连接池初始化慢_7、SpringBoot -连接池(Durid)
  5. android qq登录 获取用户信息吗,免登录 只需要一个QQ号就能获取QQ头像和QQ昵称 获取QQ用户信息API...
  6. django-redis的使用,利用配置中的缓存绑定数据库,直接获取连接对象
  7. linux安装selenium+chrome+phantomjs
  8. bean的作用域_Spring 框架基础(02):Bean的生命周期,作用域,装配总结
  9. Eclipse启动参数
  10. REST笔记(三):一种标准的超媒体格式:Atom
  11. google 浏览器离线安装包下载
  12. C#【文件操作篇】PDF文件和图片互相转换
  13. 计算机回收站概念,22.5.1 回收站概念
  14. 关于命令注入的一些介绍
  15. 股票K线指标算法整理(Java封装工具类)
  16. mysql怎么将成绩划分等级_数据库mysql中case如何给成绩划分等级?
  17. 35.静态链接库和动态链接库
  18. 醍醐灌顶——我眼中的Spring Cloud
  19. (实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】
  20. 迈瑞CL6000i全自动化学发光免疫分析仪【双向通讯】

热门文章

  1. JDA和松下携手开展综合数字供应链技术解决方案方面的创新
  2. web前端实习第一天的内心os
  3. 内温的整体优先效应实验_熔盐电解制备钨铜合金粉体槽内温场条件分析
  4. c语言之用符号自行设计随意图形
  5. 运营商精准大数据——主动出击 精准获客_用户_客户_实时
  6. 贝壳采集器: 中国日报网 数据采集
  7. 往事如烟 - 施老师
  8. [卷积系列] P3338 [ZJOI2014]力
  9. 中国移动段晓东深度解读《中国移动算力网络白皮书》
  10. 何为TLC、MLC、SLC?【转】