SQL Server 行转列,列转行。多行转成一列
一、多行转成一列(并以","隔开)
表名:A
表数据:
想要的查询结果:
查询语句:
SELECT name ,value = ( STUFF(( SELECT ',' + valueFROM AWHERE name = Test.nameFORXML PATH('')), 1, 1, '') )
FROM A AS Test
GROUP BY name;
PS:STUFF语句就是为了去掉第一个【逗号】
附STUFF用法:(从原字符的第二个开始共三个字符替换为后面的字符)
SELECT STUFF('abcdef', 2, 3, 'ijklmn');
查询结果:aijklmnef
二、一列转成多行
表名:tb
表数据:
想要的结果:
查询语句:
SELECT a.[name],b.[value]
FROM (SELECT [name],[value]=CAST('<v>'+REPLACE([value],',','</v><v>')+'</v>' AS xml) FROM tb) a
OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[value].nodes('/v') AS T(C)) b
三、行转列(转自大神张志涛的博客 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html)
1、建立表格
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tbgoCREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT)INSERT INTO tb VALUES('张三','语文',74)INSERT INTO tb VALUES('张三','数学',83)INSERT INTO tb VALUES('张三','物理',93)INSERT INTO tb VALUES('李四','语文',74)INSERT INTO tb VALUES('李四','数学',84)INSERT INTO tb VALUES('李四','物理',94)goSELECT * FROM tb
2、使用SQL Server 2000静态SQL
SELECT 姓名,max(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 end)语文,max(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 end)数学,max(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 end)物理FROM tbGROUP BY 姓名
3、使用SQL Server 2005静态SQL
SELECT *
FROM tb PIVOT( MAX(分数) FOR 课程 IN ( 语文, 数学, 物理 ) ) a;
4、使用SQL Server 2005动态SQL
--使用stuff()DECLARE @sql VARCHAR(8000)SET @sql='' --初始化变量@sqlSELECT @sql=@sql+','+课程 FROM tb GROUP BY 课程 --变量多值赋值SET @sql=stuff(@sql,1,1,'')--去掉首个','SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'exec(@sql)--或使用isnull()DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+',','')+课程 FROM tb GROUP BY 课程 SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'exec(@sql)
四、行转列结果加上总分、平均分
1、使用SQL Server 2000静态SQL
SELECT 姓名,max(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 end)语文,max(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 end)数学,max(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 end)物理,sum(分数)总分,cast(avg(分数*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名
2、使用SQL Server 2000动态SQL
DECLARE @sql VARCHAR(500)SET @sql='select 姓名'SELECT @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'from(SELECT DISTINCT 课程 FROM tb)aSET @sql=@sql+',sum(分数) 总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'exec(@sql)
3、使用SQL Server 2005静态SQL
SELECT m.*,n.总分,n.平均分from(SELECT * FROM tb pivot(max(分数)FOR 课程 IN(语文,数学,物理))a)m,(SELECT 姓名,sum(分数) 总分,cast(avg(分数*1.0)AS DECIMAL(18,2))平均分FROM tbGROUP BY 姓名)nWHERE m.姓名=n.姓名
4、使用SQL Server 2005动态SQL
--使用stuff()--DECLARE @sql VARCHAR(8000)SET @sql='' --初始化变量@sqlSELECT @sql=@sql+','+课程 FROM tb GROUP BY 课程 --变量多值赋值--同select @sql = @sql + ','+课程from (select distinct课程from tb)aSET @sql=stuff(@sql,1,1,'')--去掉首个','SET @sql='select m.* , n.总分,n.平均分 from(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+@sql+')) b) m ,(select 姓名,sum(分数) 总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'exec(@sql)--或使用isnull()DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+',','')+课程 FROM tb GROUP BY 课程SET @sql='select m.* , n.总分, n.平均分 from(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+@sql+')) b) m ,(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) nwhere m.姓名= n.姓名'exec(@sql)
五、列转行
1、建立表格
IF OBJECT_ID('tb')IS NOT NULL DROP TABLE tbgoCREATE TABLE tb(姓名 VARCHAR(10),语文 INT,数学 INT,物理 INT)INSERT INTO tb VALUES('张三',74,83,93)INSERT INTO tb VALUES('李四',74,84,94)goSELECT * FROM tbgo
2、使用SQL Server 2000静态SQL
--SQL SERVER 2000静态SQL。SELECT * FROM(SELECT 姓名,课程='语文',分数=语文 FROM tbUNION ALLSELECT 姓名,课程='数学',分数=数学 FROM tbUNION ALLSELECT 姓名,课程='物理',分数=物理 FROM tb) tORDER BY 姓名,CASE 课程 WHEN '语文' THEN 1 WHEN '数学' THEN 2 WHEN '物理' THEN 3 end
2、使用SQL Server 2000动态SQL
--SQL SERVER 2000动态SQL。--调用系统表动态生态。DECLARE @sql VARCHAR(8000)SELECT @sql=isnull(@sql+' union all ','')+' select 姓名, [课程]='+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'FROM syscolumnsWHERE Name!='姓名' AND ID=object_id('tb')--表名tb,不包含列名为姓名的其他列ORDER BY colidexec(@sql+' order by 姓名')go
3、使用SQL Server 2005静态SQL
--SQL SERVER 2005动态SQLSELECT 姓名,课程,分数 FROM tb unpivot (分数 FOR 课程 IN([语文],[数学],[物理])) t
4、使用SQL Server 2005动态SQL
--SQL SERVER 2005动态SQLDECLARE @sql NVARCHAR(4000)SELECT @sql=isnull(@sql+',','')+quotename(Name)FROM syscolumnsWHERE ID=object_id('tb')AND Name NOT IN('姓名')ORDER BY ColidSET @sql='select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'exec(@sql)
转自:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
SQL Server 行转列,列转行。多行转成一列相关推荐
- sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行
sql server 快照 In the last articles, we have learned Configuring Snapshot and Transactional SQL Serve ...
- 【SQL Server】已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 问题解决
[SQL Server]"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 问题 问题阐述 在手动对表进行删除或修改操作时,可能会出现如下情况: 表结构及数据: 原因 ...
- 【sql server】“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行“ 解决方案
[sql server]"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案 参考文章: (1)[sql server]"已更新或删除的行值要么不能 ...
- SQL Server 将指定的数据库中的所有表都列出来
在很多情况下我们需要将指定的数据库中的所有表都列出来.在使用c#进行软件开发时,我们有哪些方法可是实现这个目的呢?本人对此进行概要的总结,有以下6中方式可以实现这个目的. 1.sqldmo SQLDM ...
- 【sql server】已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 解决方法总结
#事故现场: 1.在手动修改某表中数据是,出现如下错误提示: 已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行, ...
- sql server 自定义背景、字体及显示行数
目录 显示行数 设置背景与字体 学习记录~~~~ 显示行数 设置背景与字体 还是从最上面那张图片进入,来到如下页面: 设置好了后,看看效果: 还不错,拜~~~
- mysql string agg_【转】SQL Server一个字段串拆分成多行显示或者多行数据合并成一个字符串(STRING_AGG、STRING_SPLIT)...
目录 概述 STRING_AGG(合并):多行数据合并成一个字符串,以逗号隔开. STRING_SPLIT(拆分):一个字符串,拆分成多行. 一.多行数据合并成一个字符串 1.通过 FOR xml p ...
- SQL Server 查询数据库里所有表的行数
SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...
- SQL server 数据库单表查询前n%行
use EMIS go select top 10 percent * from t_course_reg go
- SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来 select * from tbl_diary_reback a left join tbl_diary_re ...
最新文章
- 看直播赢大奖-智能物流技术培训
- 用最简单的方式训练史上最强ResNet-50,性能超过魔改结构的ResNeSt
- Unity VS Unreal,游戏开发该如何选择引擎?
- IplImage, CvMat, Mat 的关系和相互转换 再次理解 /(ㄒoㄒ)/~~
- chrome开发者工具各种骚技巧
- [CareerCup] 9.6 Generate Parentheses 生成括号
- 【 Grey Hack 】反向Shell
- android ViewPager 图片浏览和保存图片
- jsp 中包含 一个路径为变量的文件
- 戴尔R730 安装升级VMware vSphere Hypervisor (ESXi) 6.7
- ADO.NET编程(4)根据条件查询DataTable的值
- JSK-386 分段函数【入门】
- Sliding Window 单调队列解决--经典滑动窗口问题--求窗口的最大值最小值
- OpenStack手动制作CentOS 7 KVM镜像
- Google去广告——Adblock插件使用
- java面试题库精选
- 美国大选投票系统服务器 在法兰克福,网络投票处理方法,装置及服务器 Internet voting processing method, device and server...
- Python 算法交易实验41 GMM简单估计
- 计算机更改开机密码快捷方法,win7怎么修改开机密码(最快) win7修改开机密码最便捷的方法...
- 最优灵活体系结构(Optimal Flexible Architecture,OFA)
热门文章
- OpenCV图像入门
- Qt Creator使用调试助手
- C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
- C++中4种强制类型转换 ?
- C++加号运算符重载
- c++静态成员变量成员函数
- 5.Qt自定义Button按钮的实现
- 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
- c语言中转义字符是由什么和什么构成,c语言中什么是转义字符
- 修罗武神正版游戏服务器,修罗武神正版游戏官网