同表中求字段合并SQL语句

szkenny 2017-09-04 10:04:01
ID 公司名 Name 电话 职务 Name 电话 职务 网址
1 测试公司 Andy 255252134 经理 Billy 总经理 www.text.com
2 测试公司 Billy 255252136 Andy 255252135 经理
3 测试公司 Andy 255252135
4 测试公司 Andy 255252135 经理 Billy 255252136 总经理 www.text.com

通过公司名检索,要求合并后的效果为:ID:4的效果
同名字段如果都有数据,以ID为大的为准
求SQL语句,多谢
...全文
479 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
顺势而为1 2017-09-04
  • 打赏
  • 举报
回复
楼主是不是要这样的 ?


--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32))
Insert #T
select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'总经理',N'www.text.com' union all
select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'经理',null union all
select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null 
--select 4,N'测试公司',N'Andy',255252135,N'经理',N'Billy',N'255252136',N'总经理',N'www.text.com'
Go
--测试数据结束

Select [公司名],
		STUFF((select ','+Name from #t t where [公司名]=t.[公司名]  and Name is not null for xml path('')), 1, 1, '') as Name,
		STUFF((select ','+[电话] from #t t where [公司名]=t.[公司名] and [电话] is not null for xml path('')), 1, 1, '') as [电话],
		STUFF((select ','+[职务] from #t t where [公司名]=t.[公司名] and [职务] is not null for xml path('')), 1, 1, '') as [职务],
		STUFF((select ','+[Name1] from #t t where [公司名]=t.[公司名] and Name1 is not null for xml path('')), 1, 1, '') as [Name1],
		STUFF((select ','+[电话1] from #t t where [公司名]=t.[公司名] and [电话1] is not null for xml path('')), 1, 1, '') as [电话1],
		STUFF((select ','+[职务1] from #t t where [公司名]=t.[公司名] and [职务1] is not null for xml path('')), 1, 1, '') as [职务1],
		STUFF((select ','+[网址] from #t t where [公司名]=t.[公司名] and [网址] is not null for xml path('')), 1, 1, '') as [网址]
From #t  
Group By [公司名]


  • 打赏
  • 举报
回复
应该是版主 那个结果 你要的是 id大的为准的
szkenny 2017-09-04
  • 打赏
  • 举报
回复
ID 4 只有一个公司名,后面数据需要用SQL填上去
听雨停了 2017-09-04
  • 打赏
  • 举报
回复
看了半天没明白啥意思,但是我想应该不是版主理解的那个意思吧
二月十六 2017-09-04
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] int,[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32))
Insert #T
select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',N'总经理',N'www.text.com',null union all
select 2,N'测试公司',N'Billy',255252136,N'Andy',N'255252135',N'经理',null,null union all
select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null union all
select 4,N'测试公司',N'Andy',255252135,N'经理',N'Billy',N'255252136',N'总经理',N'www.text.com'
Go
--测试数据结束
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY 公司名 ORDER BY ID DESC) AS num from #T
)
SELECT * FROM cte WHERE 公司名 LIKE '%测试%' AND num=1



szkenny 2017-09-04
  • 打赏
  • 举报
回复
Name 与Name1分别为两个联系人,因为原来数据库资料来源不一样,录入时间不一样,联系人排序不一样,ID小的,肯定录入时间较久了,故需把对应的两列综合考虑,挑出ID最大的两个联系人及电话职务出来,而不是同一列名里面比较
szkenny 2017-09-04
  • 打赏
  • 举报
回复
引用 12 楼 appetizing_fish1 的回复:
Sorry,可能我没说清楚,一行可以登录两个联系人,只是同名的取ID大的,多行数据可能不止两个联系人了,就取最后两个(ID)大的
楼主可否用这种形式把你的数据写出来 ? 这样方便理解些. if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32)) Insert #T select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'总经理',N'www.text.com' union all select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'经理',null union all select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null [/quote] 可以这样建个临时表,但整合分析后要再写回原来数据库
听雨停了 2017-09-04
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32))
Insert #T
select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'经理',N'www.text.com' union all
select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'总经理',null union all
select 3,N'测试公司',N'ASD',255252135,null,null,null,null,null
--以上三条数据合并后得到的数据(按公司名分组,取最大ID下字段的值,如果为null,则取第二大ID下字段的值,依此类推)
--select 4,N'测试公司',N'ASD',255252135,N'经理',N'Andy',N'255252135',N'总经理',N'www.text.com'
Go
--测试数据结束

--解决方案
WITH cte AS ( --用for xml path使同一字段的值按id排序合并到一起,由此最大id的字段值在最前面
SELECT t.[公司名]
,STUFF((SELECT ','+ltrim([Name])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [Name]
,STUFF((SELECT ','+ltrim([电话])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [电话]
,STUFF((SELECT ','+ltrim([职务])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [职务]
,STUFF((SELECT ','+ltrim([Name1])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [Name1]
,STUFF((SELECT ','+ltrim([电话1])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [电话1]
,STUFF((SELECT ','+ltrim([职务1])
FROM #t
order by id desc FOR XML PATH('')), 1, 1, '')
AS [职务1]
,STUFF((SELECT ','+ltrim([网址])
FROM #t
WHERE [公司名]=t.[公司名]
order by id desc FOR XML PATH('')), 1, 1, '')
AS [网址]
FROM #t t
GROUP BY [公司名]
)


--取每个字段第一个逗号前的数据,也就是最大ID字段下的值
SELECT [公司名],
case when charindex(',',[Name])=0 then [Name] else left([Name],charindex(',',[Name])-1) end AS [Name],
case when charindex(',',[电话])=0 then [电话] else left([电话],charindex(',',[电话])-1) end AS [电话],
case when charindex(',',[职务])=0 then [职务] else left([职务],charindex(',',[职务])-1) end AS [职务],
case when charindex(',',[Name1])=0 then [Name1] else left([Name1],charindex(',',[Name1])-1) end AS [Name1],
case when charindex(',',[电话1])=0 then [电话1] else left([电话1],charindex(',',[电话1])-1) end AS [电话1],
case when charindex(',',[职务1])=0 then [职务1] else left([职务1],charindex(',',[职务1])-1) end AS [职务1],
case when charindex(',',[网址])=0 then [网址] else left([网址],charindex(',',[网址])-1) end AS [网址]
FROM cte
--解决方案结束


不知道这样是不是你要的结果啊
顺势而为1 2017-09-04
  • 打赏
  • 举报
回复
Sorry,可能我没说清楚,一行可以登录两个联系人,只是同名的取ID大的,多行数据可能不止两个联系人了,就取最后两个(ID)大的[/quote] 楼主可否用这种形式把你的数据写出来 ? 这样方便理解些. if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32)) Insert #T select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'总经理',N'www.text.com' union all select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'经理',null union all select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null
szkenny 2017-09-04
  • 打赏
  • 举报
回复
引用 10 楼 appetizing_fish1 的回复:
[quote=引用 9 楼 szkenny 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] [code=sql]--测试数据
数据这个是我要的,但前提是不能输进去,而是检索后Update进去[/quote] 1 测试公司 Andy 255252134 经理 Billy 总经理 www.text.com 2 测试公司 Billy 255252136 Andy 255252135 经理 3 测试公司 Andy 255252135 上面是楼主的数据, 按楼主的需求, 1. Name1: Billy 2. Name1: Andy 取ID大的就应是 Andy 啊? [/quote] Sorry,可能我没说清楚,一行可以登录两个联系人,只是同名的取ID大的,多行数据可能不止两个联系人了,就取最后两个(ID)大的
顺势而为1 2017-09-04
  • 打赏
  • 举报
回复
引用 9 楼 szkenny 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] [code=sql]--测试数据
数据这个是我要的,但前提是不能输进去,而是检索后Update进去[/quote] 1 测试公司 Andy 255252134 经理 Billy 总经理 www.text.com 2 测试公司 Billy 255252136 Andy 255252135 经理 3 测试公司 Andy 255252135 上面是楼主的数据, 按楼主的需求, 1. Name1: Billy 2. Name1: Andy 取ID大的就应是 Andy 啊?
szkenny 2017-09-04
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
[code=sql]--测试数据
数据这个是我要的,但前提是不能输进去,而是检索后Update进去
顺势而为1 2017-09-04
  • 打赏
  • 举报
回复
出来的结果错了啊,针对联系人要建位数组才行,联系方式都有数据的取ID号大的,为空的取非空的,可能不止两人,舍弃ID号小的联系人 没问题啊, 以公司名分组,用For xml合并组记录成字符串, 再取分隔符的最后一个字符串.
szkenny 2017-09-04
  • 打赏
  • 举报
回复
引用 6 楼 appetizing_fish1 的回复:


--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32))
Insert #T
select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'总经理',N'www.text.com' union all
select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'经理',null union all
select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null 
--select 4,N'测试公司',N'Andy',255252135,N'经理',N'Billy',N'255252136',N'总经理',N'www.text.com'
Go
--测试数据结束

Select [公司名],
       case when charindex(',',name)>0 then Reverse(Substring(REVERSE(Name),1,Charindex(',',REVERSE(Name))-1)) else name end as Name,
	   case when charindex(',',[电话])>0 then Reverse(Substring(REVERSE([电话]),1,Charindex(',',REVERSE([电话]))-1)) else [电话] end as [电话],
	   case when charindex(',',[职务])>0 then Reverse(Substring(REVERSE([职务]),1,Charindex(',',REVERSE([职务]))-1)) else [职务] end as [职务],
	   case when charindex(',',name1)>0 then Reverse(Substring(REVERSE(Name1),1,Charindex(',',REVERSE(Name1))-1)) else name1 end as Name1,
	   case when charindex(',',[电话1])>0 then Reverse(Substring(REVERSE([电话1]),1,Charindex(',',REVERSE([电话1]))-1)) else [电话1] end as [电话1],
	   case when charindex(',',[职务1])>0 then Reverse(Substring(REVERSE([职务1]),1,Charindex(',',REVERSE([职务1]))-1)) else [职务1] end as [职务1],
	   case when charindex(',',[网址])>0 then Reverse(Substring(REVERSE([网址]),1,Charindex(',',REVERSE([网址]))-1)) else [网址] end as [网址]
From (
			Select [公司名],
				   STUFF((select ','+Name from #t t where [公司名]=t.[公司名]  and Name is not null for xml path('')), 1, 1, '') as Name,
				   STUFF((select ','+[电话] from #t t where [公司名]=t.[公司名] and [电话] is not null for xml path('')), 1, 1, '') as [电话],
				   STUFF((select ','+[职务] from #t t where [公司名]=t.[公司名] and [职务] is not null for xml path('')), 1, 1, '') as [职务],
				   STUFF((select ','+[Name1] from #t t where [公司名]=t.[公司名] and Name1 is not null for xml path('')), 1, 1, '') as [Name1],
				   STUFF((select ','+[电话1] from #t t where [公司名]=t.[公司名] and [电话1] is not null for xml path('')), 1, 1, '') as [电话1],
				   STUFF((select ','+[职务1] from #t t where [公司名]=t.[公司名] and [职务1] is not null for xml path('')), 1, 1, '') as [职务1],
				   STUFF((select ','+[网址] from #t t where [公司名]=t.[公司名] and [网址] is not null for xml path('')), 1, 1, '') as [网址]
			From #t  
			Group By [公司名]
	  ) a


BM 出来的结果错了啊,针对联系人要建位数组才行,联系方式都有数据的取ID号大的,为空的取非空的,可能不止两人,舍弃ID号小的联系人
顺势而为1 2017-09-04
  • 打赏
  • 举报
回复


--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[公司名] nvarchar(24),[Name] nvarchar(25),[电话] varchar(20),[职务] nvarchar(24),[Name1] nvarchar(29),[电话1] nvarchar(29),[职务1] nvarchar(32),[网址] nvarchar(32))
Insert #T
select 1,N'测试公司',N'Andy',255252134,N'经理',N'Billy',null,N'总经理',N'www.text.com' union all
select 2,N'测试公司',N'Billy',255252136,null,N'Andy',N'255252135',N'经理',null union all
select 3,N'测试公司',N'Andy',255252135,null,null,null,null,null
--select 4,N'测试公司',N'Andy',255252135,N'经理',N'Billy',N'255252136',N'总经理',N'www.text.com'
Go
--测试数据结束

Select [公司名],
case when charindex(',',name)>0 then Reverse(Substring(REVERSE(Name),1,Charindex(',',REVERSE(Name))-1)) else name end as Name,
case when charindex(',',[电话])>0 then Reverse(Substring(REVERSE([电话]),1,Charindex(',',REVERSE([电话]))-1)) else [电话] end as [电话],
case when charindex(',',[职务])>0 then Reverse(Substring(REVERSE([职务]),1,Charindex(',',REVERSE([职务]))-1)) else [职务] end as [职务],
case when charindex(',',name1)>0 then Reverse(Substring(REVERSE(Name1),1,Charindex(',',REVERSE(Name1))-1)) else name1 end as Name1,
case when charindex(',',[电话1])>0 then Reverse(Substring(REVERSE([电话1]),1,Charindex(',',REVERSE([电话1]))-1)) else [电话1] end as [电话1],
case when charindex(',',[职务1])>0 then Reverse(Substring(REVERSE([职务1]),1,Charindex(',',REVERSE([职务1]))-1)) else [职务1] end as [职务1],
case when charindex(',',[网址])>0 then Reverse(Substring(REVERSE([网址]),1,Charindex(',',REVERSE([网址]))-1)) else [网址] end as [网址]
From (
Select [公司名],
STUFF((select ','+Name from #t t where [公司名]=t.[公司名] and Name is not null for xml path('')), 1, 1, '') as Name,
STUFF((select ','+[电话] from #t t where [公司名]=t.[公司名] and [电话] is not null for xml path('')), 1, 1, '') as [电话],
STUFF((select ','+[职务] from #t t where [公司名]=t.[公司名] and [职务] is not null for xml path('')), 1, 1, '') as [职务],
STUFF((select ','+[Name1] from #t t where [公司名]=t.[公司名] and Name1 is not null for xml path('')), 1, 1, '') as [Name1],
STUFF((select ','+[电话1] from #t t where [公司名]=t.[公司名] and [电话1] is not null for xml path('')), 1, 1, '') as [电话1],
STUFF((select ','+[职务1] from #t t where [公司名]=t.[公司名] and [职务1] is not null for xml path('')), 1, 1, '') as [职务1],
STUFF((select ','+[网址] from #t t where [公司名]=t.[公司名] and [网址] is not null for xml path('')), 1, 1, '') as [网址]
From #t
Group By [公司名]
) a




27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧