一、多行转成一列(并以","隔开)

表名: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 行转列,列转行。多行转成一列相关推荐

  1. sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行

    sql server 快照 In the last articles, we have learned Configuring Snapshot and Transactional SQL Serve ...

  2. 【SQL Server】已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 问题解决

    [SQL Server]"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 问题 问题阐述 在手动对表进行删除或修改操作时,可能会出现如下情况: 表结构及数据: 原因 ...

  3. 【sql server】“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行“ 解决方案

    [sql server]"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案 参考文章: (1)[sql server]"已更新或删除的行值要么不能 ...

  4. SQL Server 将指定的数据库中的所有表都列出来

    在很多情况下我们需要将指定的数据库中的所有表都列出来.在使用c#进行软件开发时,我们有哪些方法可是实现这个目的呢?本人对此进行概要的总结,有以下6中方式可以实现这个目的. 1.sqldmo SQLDM ...

  5. 【sql server】已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 解决方法总结

    #事故现场: 1.在手动修改某表中数据是,出现如下错误提示:  已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行, ...

  6. sql server 自定义背景、字体及显示行数

    目录 显示行数 设置背景与字体 学习记录~~~~ 显示行数 设置背景与字体 还是从最上面那张图片进入,来到如下页面: 设置好了后,看看效果: 还不错,拜~~~

  7. mysql string agg_【转】SQL Server一个字段串拆分成多行显示或者多行数据合并成一个字符串(STRING_AGG、STRING_SPLIT)...

    目录 概述 STRING_AGG(合并):多行数据合并成一个字符串,以逗号隔开. STRING_SPLIT(拆分):一个字符串,拆分成多行. 一.多行数据合并成一个字符串 1.通过 FOR xml p ...

  8. SQL Server 查询数据库里所有表的行数

    SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...

  9. SQL server 数据库单表查询前n%行

    use EMIS go select top 10 percent * from t_course_reg go

  10. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列

    表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来     select * from tbl_diary_reback a left join tbl_diary_re ...

最新文章

  1. 看直播赢大奖-智能物流技术培训
  2. 用最简单的方式训练史上最强ResNet-50,性能超过魔改结构的ResNeSt
  3. Unity VS Unreal,游戏开发该如何选择引擎?
  4. IplImage, CvMat, Mat 的关系和相互转换 再次理解 /(ㄒoㄒ)/~~
  5. chrome开发者工具各种骚技巧
  6. [CareerCup] 9.6 Generate Parentheses 生成括号
  7. 【 Grey Hack 】反向Shell
  8. android ViewPager 图片浏览和保存图片
  9. jsp 中包含 一个路径为变量的文件
  10. 戴尔R730 安装升级VMware vSphere Hypervisor (ESXi) 6.7
  11. ADO.NET编程(4)根据条件查询DataTable的值
  12. JSK-386 分段函数【入门】
  13. Sliding Window 单调队列解决--经典滑动窗口问题--求窗口的最大值最小值
  14. OpenStack手动制作CentOS 7 KVM镜像
  15. Google去广告——Adblock插件使用
  16. java面试题库精选
  17. 美国大选投票系统服务器 在法兰克福,网络投票处理方法,装置及服务器 Internet voting processing method, device and server...
  18. Python 算法交易实验41 GMM简单估计
  19. 计算机更改开机密码快捷方法,win7怎么修改开机密码(最快) win7修改开机密码最便捷的方法...
  20. 最优灵活体系结构(Optimal Flexible Architecture,OFA)

热门文章

  1. OpenCV图像入门
  2. Qt Creator使用调试助手
  3. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
  4. C++中4种强制类型转换 ?
  5. C++加号运算符重载
  6. c++静态成员变量成员函数
  7. 5.Qt自定义Button按钮的实现
  8. 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
  9. c语言中转义字符是由什么和什么构成,c语言中什么是转义字符
  10. 修罗武神正版游戏服务器,修罗武神正版游戏官网