SQL查询案例:多行转换为一行

1.案例1
SELECT S_FUNCCODE,
CASE WHEN COUNT(S_ROLENAME) = 1 THEN MAX(S_ROLENAME)
WHEN COUNT(S_ROLENAME) = 2 THEN MAX( CASE WHEN SubQuery.no = 1 THEN S_ROLENAME || ',' ELSE '' END ) || MAX( CASE WHEN SubQuery.no = 2 THEN S_ROLENAME ELSE '' END )
WHEN COUNT(S_ROLENAME) = 3 THEN MAX( CASE WHEN SubQuery.no = 1 THEN S_ROLENAME || ',' ELSE '' END ) || MAX( CASE WHEN SubQuery.no = 2 THEN S_ROLENAME || ','ELSE '' END ) || MAX( CASE WHEN SubQuery.no = 3 THEN S_ROLENAME ELSE '' END )
END AS S_ROLENAME_TOTAL
FROM
(
select row_number() over (PARTITION BY S_FUNCCODE order by S_ROLENAME) as NO,S_FUNCCODE,S_ROLENAME FROM TMP_ROLEFUNC A,TM_ROLE B WHERE A.S_ROLEID=B.S_ROLEID
) subQuery
GROUP BY S_FUNCCODE

;


2.案例2
SQL查询案例:多行转换为一行
使用通常的方式测试表与测试数据
CREATE TABLE TestTitle (
name VARCHAR(10),
titleVARCHAR(10)
);

INSERT INTO TestTitle VALUES ('张三', '程序员');
INSERT INTO TestTitle VALUES ('张三', '系统管理员');
INSERT INTO TestTitle VALUES ('张三', '网络管理员');
INSERT INTO TestTitle VALUES ('李四', '项目经理');
INSERT INTO TestTitle VALUES ('李四', '系统分析员');

要求
对于测试数据,要求查询结果为:
张三程序员,系统管理员,网络管理员
李四项目经理,系统分析员
这种结构的结果。
思路
简单查看这个结果,很像对字符型的GROUP BY处理。
数值类型的可以SUM,但是字符类型的无法这么处理。
只好依次MAX(1) + MAX(2) + MAX(3)这种办法来处理。
实现
第一步,设置好分组的编号
SELECT
ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
name,
title
FROM
TestTitle
ORDER BY
name,
title
no name title
-------------------- ---------- ----------
1李四 系统分析员
2李四 项目经理
1张三 程序员
2张三 网络管理员
3张三 系统管理员
第二步,根据有编号的子查询,进行分组处理
SELECT
name,
CASE WHEN COUNT(title) = 1 THEN MAX(title)
WHEN COUNT(title) = 2 THEN
MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 2 THEN titleELSE '' END )
WHEN COUNT(title) = 3 THEN
MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 2 THEN title + ','ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 3 THEN titleELSE '' END )
END AS new_title
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
name,
title
FROM
TestTitle
) subQuery
GROUP BY
name
执行结果
name new_title
---------- ----------------------------------
李四 系统分析员,项目经理
张三 程序员,网络管理员,系统管理员

相关文档
最新文档