SQLSERVER将子查询数据合并拼接成一个字段

115 篇文章 0 订阅
120 篇文章 0 订阅

业务场景:
有两张表,部门表和员工表
部门表:
部门编码部门名称
1 A
2 A
3 A
4 B

员工表:
员工名称 所属部门
张三 1
李四 1
王五 1
赵六 2

现在需要一个部门人员报表,要求将该部门的员工合并显示在一列,如:
部门编码 部门名称 所属人员
1 A 张三、李四、王五
2 B 赵六

解决方案:
通过SQLSERVER的FOR XML PATH函数 + STUFF函数,对查询出来的数据进行合并拼接,放到指定的字段
select STUFF((select ‘,’ + emp.name from t_employee emp where emp.dept_id = dept.id for xml path(‘’)),1,1,‘’) as emp_names from t_Department dept

解析:

一、

FOR XML PATH (“行名称”) 将查询结果集以XML形式展现,将多行的结果,展示在同一行

--第一行

<列1名称>列1内容</列1名称> --第一列

<列2名称>列2内容</列2名称>

……

--第二行

<列1名称>列1内容</列1名称> --第一列

<列2名称>列2内容</列2名称>

……

二、
STUFF(expression,start,length,replacewith)
STUFF 函数将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符;然后将第二个字符串插入到第一个字符串的开始位置。

1、expression
字符数据的表达式。expression可以是常量、变量,也可以是子查询的字段

2、start
start用来指定删除和插入开始位置的数值。 如果 start 值为负或为零,则返回空字符串。 如果 start 的长度大于第一个 expression,则返回空字符串。start 的类型也可以是 bigint。
注意:SQLSERVER 从1开始,start 值1 表示第一个字符。

3、length
length用来指定要删除的字符个数。 如果 length值 为负,则返回空字符串。 如果 length 的长度大于第一个 character_expression,则最多可以删除到最后一个 character_expression 中的最后一个字符。 如果 length 为零,则插入在 start 位置发生,并且不会删除任何字符。length 的类型也可以是 bigint。

4、repacewith
替换字符表达式。同样,也可以是常量、变量,也可以是字段或二进制字段。
从 start 开始替换 length 个字符的 expression。 如果 repacewith为 NULL,则在不插入任何内容的情况下删除字符。

5、返回类型
如果 expression是字符数据类型,则返回字符数据。
如果 expression是二进制数据类型,则返回二进制数据。

注意:
expression 如果是子查询语句,则需要在查询结果加上一个字符,如上图例子,否则执行的结果会带出查询的字段名:
name >张三李四

这是因为:直接查询字段,FOR XML PATH会默认返回字段名作为列名称,加上’,'之后,该列就没有名称,那么自然返回的就是,张三,李四,…此时,再用STUFF函数去掉第一个逗号,即可

如果有讲错或者疏漏的地方,还望指点!

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

普通网友

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值