博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 行转列,列转行。多行转成一列
阅读量:5286 次
发布时间:2019-06-14

本文共 4638 字,大约阅读时间需要 15 分钟。

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

表名:A

表数据:

想要的查询结果:

查询语句:

SELECT  name ,        value = ( STUFF(( SELECT    ',' + value                          FROM      A                          WHERE     name = Test.name                        FOR                          XML PATH('')                        ), 1, 1, '') )FROM    A AS TestGROUP BY name;

PS:STUFF语句就是为了去掉第一个【逗号】

附STUFF用法:(从原字符的第二个开始共三个字符替换为后面的字符)

SELECT STUFF('abcdef', 2, 3, 'ijklmn');

查询结果:aijklmnef

 二、一列转成多行

表名:tb

表数据:

想要的结果:

查询语句:

SELECT a.[name],b.[value]FROM (SELECT [name],[value]=CAST('
'+REPLACE([value],',','
')+'
' AS xml) FROM tb) aOUTER 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 tb UNION ALL SELECT 姓名,课程='数学',分数=数学 FROM tb UNION ALL SELECT 姓名,课程='物理',分数=物理 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

转载于:https://www.cnblogs.com/soundcode/p/8615265.html

你可能感兴趣的文章
剑指offer——重建二叉树
查看>>
二叉树——在二叉树中找到一个节点的前驱节点
查看>>
8.Java语言基础:函数
查看>>
从前端接收时间类型,要在实体类中加上@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解...
查看>>
移动cell的位置
查看>>
iTOP-iMX6UL全能板-linux-usb-wifi的使用
查看>>
Django学习---笔记一
查看>>
树莓派开发板入门学习笔记2:[转]树莓派系统在VM中能做什么
查看>>
利用F#编写、理解Y组合子函数
查看>>
Flink学习笔记:Time的故事
查看>>
BZOJ3158 千钧一发(最小割)
查看>>
@SuppressLint("NewApi")
查看>>
Windows下Postgresql数据库的下载与配置方法
查看>>
【solr】Solr与JDK对应版本关系,Tomcat与JDK
查看>>
16种基本颜色关键字
查看>>
Week 2
查看>>
常见的传输线阻抗计算软件(轉自笨笨熊的屋屋)
查看>>
Python 分解带括号的字符串
查看>>
C#中event和delegate的区别
查看>>
hdu 2795 Billboard 线段树单点更新
查看>>