问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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值将联系人和联系方式组装成一个长字符串返回。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果13必须要关闭的功能,苹果13新手机要关闭哪些功能 电线2.5平方是多少直径是多少米 2.5平方铜线的直径是多少毫米? 游龙门记 高铁能托运猫吗 电子邮箱是什么 电子邮箱是什么格式 探客手电产品的质量怎么样呢?口碑不是催出来的吧 手电筒品牌 空调为什么会亮红灯? 盆栽芋头能活多久 oracle取最大时间 CPUAMD1500x b350 750ti 可以流畅玩刺激战场吧? 和平精英是不是只要开挂了就被封了? 苹果八手机上显示中国移动e怎么转换成4G? 和平精英是不是很垃圾 大家觉得和平精英是不是很垃圾 为什么OPPO软件商店显示和平精英该应用无法正常启动? 为什么iphone上网有时候是E有时候是4G? 和平精英里哪里人最少物资肥 你觉得《王者荣耀》和《和平精英》哪个游戏带给你的快乐多一些? 王者荣耀和和平精英必须要你删一个,你删哪个? 和平精英和全军出击哪个更好玩? PUBG和和平精英比起来,哪个更适合新手玩家? 工行余额查询进不去 新插座(三孔的)、怎么都插不进、用锤子砸也砸不进怎么回事? 三孔插座有一个孔捅不进去怎么办? 新买的iphone6充电头是三孔的怎么回事啊?插不进去啊! 美股主要看什么指数? 我们A股主要是看上证指数,那么: 是道琼斯指数,还是纳斯达克指数? 墙壁三孔插座接线孔怎么插也插不进去,是像空气开关一样 步步高y913可以用快速充电接头吗 sql两表联合查询“根据这两个字段值相同 查找其他字段值”怎么做? 网卡的工作原理及作用 童话作文《过年了》300字 剃须刀是飞科的好还是飞利浦的好 作文大全300字三年级上册关于怎么过年的 我想找个同城女性,如何找到她们手机号?谢谢 想知道怎样才能得到一个女孩的手机号码! oracle如何获取最大时间的整条记录 怎样要女孩的手机号 rickowens鞋子多少钱 关于日本rickowens的价格问题,一般ro的鞋子不是都在5k左右吗?为什么日本的鞋子都要到8k 哪里可以找到女性手机号 rick owens鞋头多少cm 要如何轻易得到女生的手机号码? rickowens五芒星鞋头跟鞋底有色差吗 我要找一个女人,江西南昌人,叫戴分群,还有她现在的手机号码 rickowens鞋子绑有多高 怎么要女孩的手机号码 黄子韬这双鞋叫什么啊,谢谢! 如何能知道一个女孩的手机号?