行转列或列转行写法

简介: 原文: 行转列或列转行写法 两种方式: /* 实现行转列 a name objec score a EN 89 a CH 78 a HO 99 b EN 34 b CH 88 b HO 66 要求输出结果...
原文: 行转列或列转行写法

两种方式:

/*	
实现行转列
a
name	objec	score
a		EN		89
a		CH		78
a		HO		99
b		EN		34
b		CH		88
b		HO		66
要求输出结果为:
name	EN	CH	HO
a		89	78	99
b		34	88	66
*/

USE tempdb
IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL 
DROP TABLE t


CREATE TABLE t
(
	NAME	CHAR(10),
	objec	CHAR(10),
	score	FLOAT
)
INSERT INTO t
VALUES('a','EN',89),('a','CH',78),('a','HO',99),('b','EN',34),('b','CH',88),('b','HO',66)

SELECT * FROM T

SELECT NAME ,MAX(CASE objec WHEN 'EN' THEN score ELSE 0 END ) EN,MAX(CASE objec WHEN 'CH' THEN score ELSE 0 END ) CH,MAX(CASE objec WHEN 'HO' THEN score ELSE 0 END ) HO
FROM t
GROUP BY NAME 
--=======================================================================================================================================================
/*	
实现行转列
a
name	objec	score
a		EN		89
a		CH		78
a		HO		99
b		EN		34
b		CH		88
b		HO		66
要求输出结果为:
name	objec		totalsorce
a		EN,CH,HO	266
b		EN,CH,HO	188
*/

USE tempdb
IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL 
DROP TABLE t

CREATE TABLE t
(
	NAME	CHAR(10),
	objec	CHAR(10),
	score	FLOAT
)
INSERT INTO t
VALUES('a','EN',89),('a','CH',78),('a','HO',99),('b','EN',34),('b','CH',88),('b','HO',66)

SELECT * FROM T

--为了去除objec中的最后一个逗号,插入一个临时表,并使用substring处理
SELECT name ,(SELECT LTRIM(RTRIM(objec))+',' FROM T WHERE objec=t.objec FOR XML PATH('')) objec,SUM(temp.score) totalscroe INTO #tmp
FROM T temp
GROUP BY name 


SELECT NAME ,SUBSTRING(objec,0,LEN(objec)-1) objec ,totalscroe
FROM #tmp


目录
相关文章
|
10月前
|
SQL 存储 Oracle
通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)
在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一、MSsqlserver中我们通常的用法
309 0
|
SQL
SQL中的行转列和列转行
SQL是IT行业很多岗位都要求具备的一项能力,对于数据岗位而言更是如此,甚至说扎实的SQL基础也往往是入职这些岗位的必备技能。而在SQL面试中,一道出镜频率很高的题目就是行转列和列转行的问题,可以说这也是一道经典的SQL题目,本文就这一问题做以介绍分享。
833 0
SQL中的行转列和列转行
|
SQL
SQL中行转列、列转行
SQL中行转列、列转行
215 0
SQL中行转列、列转行
|
关系型数据库 Oracle
|
移动开发 关系型数据库 Oracle