sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据相关的知识,希望对你有一定的参考价值。
根据这个条件,以下面的表为例,查询这张表的数据的SQL怎么写?
id name fk
1 张三 1
2 李四 1
3 王五 1
4 赵六 2
……
根据上面条件,查询出来的结果应该如下:
name fk
张三、李四、王五 1
赵六 2
……
name按相同的fk叠加,fk不固定。这SQL怎么写,麻烦大家帮忙一下。
,
STUFF(( SELECT '、' + LTRIM(RTRIM(name
))
FROM [表] a2
-- WHERE a2.fk= a.fk
FOR
XML PATH('')
), 1, 1, '') AS b
FROM [表] a 参考技术A 先写一个函数。
create function get_name ( @fk int )
returns varchar(1000)
as
begin
declare @c varchar(1000)
set @c = ''
select @c = @c + name + '、' from 表 where fk = @fk
return @c
end
go
select distinct fk,dbo.get_name(fk) from 表
两张表联合查询,其中一张表对应多行。将多行的数据合并为一行,并用,隔开
直接上代码
1 SELECT DISTINCT [A].[BizID] 2 ,STUFF((SELECT ‘,‘+ ActivityModelStepName + ‘:‘+ UserName FROM [dbo].BizBaseStep WHERE BizID = A.BizID 3 FOR XML PATH(‘‘) 4 ) ,1,1,‘‘ )AS auditor 5 FROM [dbo].[BizBase] AS A
查询结果如下:
for xml path(‘’) 作用是将查询结果组成一个xml;
例如 :
SELECT TOP 5 BizID,ApplySubject FROM bizbase FOR XML PATH (‘‘)
查询结果为:
<BizID>000299a4-daed-49f5-ae5f-6e4500917d58</BizID>
<ApplySubject>关于青岛海创开发建设投资有限公司青岛铁路北客站安置区B-1区项目李沧区板桥坊河以南、胶济客运既有线以西、安顺路以东单体竣工验收的申请</ApplySubject>
<BizID>00037f41-77dc-4393-8224-08655cdf1869</BizID>
<ApplySubject>0327关于道路包车客运经营许可的申请</ApplySubject>
<BizID>0003ee84-01a5-4c36-8ba0-d5b9bfa1670b</BizID>
<ApplySubject>关于林语山畔(二期:3#-7#、12#楼及幼儿园)工程剩余工程工程安全报监的申请</ApplySubject>
<BizID>00045126-e379-45fc-a50b-e136ebaf3ca8</BizID>
<ApplySubject>关于青岛高新技术产业开发区管理委员会公共事业服务中心广盛路道路绿化提升工程汇智桥路至华中路报审修建性详细规划方案报审修建性详细规则方案的申请</ApplySubject>
<BizID>000507e6-7085-4d97-a1bb-236aaefd9545</BizID>
<ApplySubject>关于青岛浩阔源福顺工贸有限公司无公害水产品产地认定</ApplySubject>
STUFF 作用是删除 第一个‘,’(sql的下标是从 1开始的)
在一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串
SELECT STUFF(‘abcdef‘, 2, 3, ‘ijklmn‘)
GO
下面是结果集
aijklmnef
以上是关于sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据的主要内容,如果未能解决你的问题,请参考以下文章
两张表联合查询,其中一张表对应多行。将多行的数据合并为一行,并用,隔开
SQL SERVER,一张表中,有多个字段关联另一张表,怎么写SQL语句?