SQL 数据库联合查询,其中一张表需要将多个相同ID对应信息横向排列
发布网友
发布时间:2022-05-05 08:36
我来回答
共4个回答
热心网友
时间:2023-10-25 05:48
这个我遇到过
这么写: A.客户ID,A.客户名称,A.客户备注, B.客户ID,B.联系人,B.联系方式 FROM 表1 A RITHT JOIN 表2 B ON A.客户ID = B.客户ID
出来的效果是:
热心网友
时间:2023-10-25 05:49
--没有具体表结构所以按照你提供的表写了一下,在使用前字段名自己整理一下,
--最好用英文字母做字段名,不然语句写起来有些地方要加引号
--创建结果表
select 客户ID, 客户名称,客户备注 into 结果表 from 表1
--创建联系人临时表
select identity(int,1,1)as 序号,cast(0 as VARCHAR(10)) as 列名,客户ID,联系人,联系方式 into 联系方式 from 表2
/** 整理结果表 增加字段***/
--单一客户最大联系人数
DECLARE @ad int
--单一客户最多联系人数
select @ad=max(addmax) from (select 客户ID,count(客户ID) addmax from 表2 group by 客户ID) a
--结果表增加字段
DECLARE @addmax varchar(10),
@add int,
@strsql varchar(8000),
@lianxr varchar(10),
@lianxfs varchar(50)
SELECT @add = 1 --增量
SELECT @addmax = 1 --起始
WHILE @addmax <= @ad --最大
BEGIN
--字段名称
select @lianxr= '联系人'+@addmax,@lianxfs= '联系方式'+@addmax
--组织语句
set @strsql='alter table paiming add '+@lianxr+' varchar(10),'+@lianxfs+' varchar(50)'
--执行语句
exec (@strsql)
--增量知道最大
select @addmax = @addmax + @add
END
/** 数据整理 ***/
--更新联系人列名 为后面游标处理做准备
update 联系方式 set @ad=列名=case when @add=客户ID then @ad+1 else 列名+1 end,@add=客户ID
--最大序号,也就是联系人表里一共有多少条数据需要处理
select @ad=max(序号) from 联系方式
DECLARE @khid varchar(10),
@lxr varchar(10),
@lxfs varchar(50)
SELECT @add = 1 --增量
SELECT @addmax = 1 --起始
WHILE @addmax <= @ad --最大
BEGIN
--需要更新的数据,根据列名确定更新的字段名,及需要的数据
select @lianxr= '联系人'+列名,@lianxfs= '联系方式'+列名,@lxr=联系人,@lxfs=联系方式,@khid=客户ID from 联系方式 where 序号=@addmax
--组织语句
set @strsql='update 结果表 set '+@lianxr+'='+@lxr+','+@lianxfs+'='+@lxfs+' where 客户ID='+@khid
--执行更新
exec (@strsql)
--增量 直到最后一条数据完成
select @addmax = @addmax + @add
END
--显示结果
select * from 结果表
--删除临时表
drop table 结果表,联系方式
热心网友
时间:2023-10-25 05:49
导入到临时表后,先用交叉表——形成横向排列,然后,再将数据追加到正式表/
再判ID/
表一是项目,这些项目是相对固定的,即并不经常变化,最主要的是每个人都有相同的项(可以值为0),因此,可以根据表一的项动态生成一个你需要的那个横向表(叫作表三吧),使用表一中的项目ID作字段名即可.平时的数据就存放在表三里(表二不再需要),你所要求的修改和显示都很好实现,而且效率要高得多.
当表一的项增/删时,修改表三的结构即可,以后你的查询串则根据表一生成.
热心网友
时间:2023-10-25 05:50
一条SQL语句应该是没办法。因为同一个ID其对应的联系人和联系方式的个数是不固定的,可以用函数的方式按ID值将联系人和联系方式组装成一个长字符串返回。
热心网友
时间:2023-10-25 05:48
这个我遇到过
这么写: A.客户ID,A.客户名称,A.客户备注, B.客户ID,B.联系人,B.联系方式 FROM 表1 A RITHT JOIN 表2 B ON A.客户ID = B.客户ID
出来的效果是:
热心网友
时间:2023-10-25 05:49
--没有具体表结构所以按照你提供的表写了一下,在使用前字段名自己整理一下,
--最好用英文字母做字段名,不然语句写起来有些地方要加引号
--创建结果表
select 客户ID, 客户名称,客户备注 into 结果表 from 表1
--创建联系人临时表
select identity(int,1,1)as 序号,cast(0 as VARCHAR(10)) as 列名,客户ID,联系人,联系方式 into 联系方式 from 表2
/** 整理结果表 增加字段***/
--单一客户最大联系人数
DECLARE @ad int
--单一客户最多联系人数
select @ad=max(addmax) from (select 客户ID,count(客户ID) addmax from 表2 group by 客户ID) a
--结果表增加字段
DECLARE @addmax varchar(10),
@add int,
@strsql varchar(8000),
@lianxr varchar(10),
@lianxfs varchar(50)
SELECT @add = 1 --增量
SELECT @addmax = 1 --起始
WHILE @addmax <= @ad --最大
BEGIN
--字段名称
select @lianxr= '联系人'+@addmax,@lianxfs= '联系方式'+@addmax
--组织语句
set @strsql='alter table paiming add '+@lianxr+' varchar(10),'+@lianxfs+' varchar(50)'
--执行语句
exec (@strsql)
--增量知道最大
select @addmax = @addmax + @add
END
/** 数据整理 ***/
--更新联系人列名 为后面游标处理做准备
update 联系方式 set @ad=列名=case when @add=客户ID then @ad+1 else 列名+1 end,@add=客户ID
--最大序号,也就是联系人表里一共有多少条数据需要处理
select @ad=max(序号) from 联系方式
DECLARE @khid varchar(10),
@lxr varchar(10),
@lxfs varchar(50)
SELECT @add = 1 --增量
SELECT @addmax = 1 --起始
WHILE @addmax <= @ad --最大
BEGIN
--需要更新的数据,根据列名确定更新的字段名,及需要的数据
select @lianxr= '联系人'+列名,@lianxfs= '联系方式'+列名,@lxr=联系人,@lxfs=联系方式,@khid=客户ID from 联系方式 where 序号=@addmax
--组织语句
set @strsql='update 结果表 set '+@lianxr+'='+@lxr+','+@lianxfs+'='+@lxfs+' where 客户ID='+@khid
--执行更新
exec (@strsql)
--增量 直到最后一条数据完成
select @addmax = @addmax + @add
END
--显示结果
select * from 结果表
--删除临时表
drop table 结果表,联系方式
热心网友
时间:2023-10-25 05:49
导入到临时表后,先用交叉表——形成横向排列,然后,再将数据追加到正式表/
再判ID/
表一是项目,这些项目是相对固定的,即并不经常变化,最主要的是每个人都有相同的项(可以值为0),因此,可以根据表一的项动态生成一个你需要的那个横向表(叫作表三吧),使用表一中的项目ID作字段名即可.平时的数据就存放在表三里(表二不再需要),你所要求的修改和显示都很好实现,而且效率要高得多.
当表一的项增/删时,修改表三的结构即可,以后你的查询串则根据表一生成.
热心网友
时间:2023-10-25 05:50
一条SQL语句应该是没办法。因为同一个ID其对应的联系人和联系方式的个数是不固定的,可以用函数的方式按ID值将联系人和联系方式组装成一个长字符串返回。