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

本文介绍了一种使用SQL对多个字符串字段进行组合查询的方法。通过ROW_NUMBER()函数为每条记录分配序号,结合CASE WHEN语句实现不同数量的职位名称拼接。此外,还提供了一种利用FOR XML PATH进行字符串拼接的简便方式。

使用通常的方式

测试表与测试数据

CREATE TABLE TestTitle (

name   VARCHAR(10),

title VARCHAR(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 title ELSE '' 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 title ELSE '' 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

---------- ----------------------------------

李四         系统分析员,项目经理

张三         程序员,网络管理员,系统管理员

 

 

使用FOR XML的方式

测试表与测试数据 要求

与前面的一样

 

思路

首先把一个用户的数据,单独的读取出来

然后按照分组进行处理

 

实现

第一步 把一个用户的数据,单独的读取出来

 

SELECT

',' + title

FROM

TestTitle

WHERE

name = '张三'

FOR XML PATH('')

 

 

 

第二步 Group By 每个人

 

SELECT

name,

STUFF(

    (

    SELECT

      ',' + title

    FROM

      TestTitle subTitle

    WHERE

      name = TestTitle.name

    FOR XML PATH('')

    ),

    1, 1, '') AS allTitle

FROM

TestTitle

GROUP BY

name

 

执行结果

 

name       allTitle

---------- --------------------------------

李四         项目经理,系统分析员

张三         程序员,系统管理员,网络管理员

 

 

 

转载于:https://www.cnblogs.com/a36040343/archive/2010/12/14/1905252.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值