SQL 数据库联合查询,其中一张表需要将多个相同ID对应信息横向排列

表1客户ID客户名称客户备注1客户1备注12客户2备注23客户3备注34客户4备注45客户5备注5表2客户ID联系人联系方式1联系人1-1方式11联系人1-2方式22联系... 表1
客户ID 客户名称 客户备注
1 客户1 备注1
2 客户2 备注2
3 客户3 备注3
4 客户4 备注4
5 客户5 备注5
表2
客户ID 联系人 联系方式
1 联系人1-1 方式1
1 联系人1-2 方式2
2 联系人2-1 方式3
1 联系人1-3 方式4
3 联系人3-1 方式5

两张表需要联合查询出:
客户ID 客户名称 客户备注 客户ID 联系人1 联系方式 客户ID 联系人2 联系方式 客户ID 联系人3 联系方式
1 客户1 备注1 1 联系人1-1 方式1 1 联系人1-2 方式2 1 联系人1-3 方式4
2 客户2 备注2 2 联系人2-1 方式3
3 客户3 备注3 3 联系人3-1 方式5
4 客户4 备注4
5 客户5 备注5
每个客户可能对应有多个联系人,需要将多个联系人按照客户ID 进行横向显示。
图片为:
展开
 我来答
wangkaige1
2012-01-26 · 超过19用户采纳过TA的回答
知道答主
回答量:80
采纳率:0%
帮助的人:47.4万
展开全部

这个我遇到过

这么写:   A.客户ID,A.客户名称,A.客户备注, B.客户ID,B.联系人,B.联系方式 FROM 表1 A RITHT JOIN 表2 B ON A.客户ID = B.客户ID 

出来的效果是:

kklgb
2012-01-27 · TA获得超过504个赞
知道小有建树答主
回答量:573
采纳率:0%
帮助的人:227万
展开全部
--没有具体表结构所以按照你提供的表写了一下,在使用前字段名自己整理一下,
--最好用英文字母做字段名,不然语句写起来有些地方要加引号

--创建结果表
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 结果表,联系方式
更多追问追答
追问
看着比较复杂,我给你一个截图是我现在目前表的结构,看样子需要你手把手给写出来才行啊!写好的话我再给你追加10个财富值。
多个相同客户ID横向显示。
客户基本资料:company_basic
联系人信息:contact_person
图片为:
追答
/*** 创建结果表 **/
select 客户ID, 客户名称,邮编,地址 into tmp_jieguo from company_basic
--创建联系人临时表
select identity(int,1,1)as 序号,cast(0 as bigint)as lxrID,客户ID,姓名,固定电话+'、'+手机号码 as lxfs into tmp_lxr from contact_person order by 客户ID,联系人ID

/** 整理结果表 增加字段***/
--单一客户最大联系人数
DECLARE @ad int
select @ad=max(addmax) from (select 客户ID,count(客户ID) addmax from contact_person 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 tmp_jieguo add '+@lianxr+' varchar(10),'+@lianxfs+' varchar(50)'
exec (@strsql)
select @addmax = @addmax + @add
END

/** 数据整理 ***/
DECLARE @aad bigint,@aadd bigint
set @aad=0
set @aadd=0
update tmp_lxr set @aad=lxrID=case when @aadd=客户ID then @aad+1 else lxrID+1 end,@aadd=客户ID

DECLARE @khid varchar(10),
@lxr varchar(10),
@lxfs varchar(100),
@abc bigint,
@abb bigint,
@aba bigint,
@sql varchar(8000),
@lixr varchar(10),
@lixfs varchar(100)
select @abc=max(序号) from tmp_lxr
SELECT @abb = 1
SELECT @aba = 1
WHILE @aba <= @abc
BEGIN
select @lixr= '联系人'+cast(lxrID as VARCHAR(10)),@lixfs= '联系方式'+cast(lxrID as VARCHAR(10)),@lxr=姓名,@lxfs=lxfs,@khid=客户ID from tmp_lxr where 序号=@aba
set @sql='update tmp_jieguo set '+@lixr+'='''+@lxr+''','+@lixfs+'='''+@lxfs+''' where 客户ID='+@khid
exec (@sql)
select @aba = @aba + @abb
END
/**** 显示结果 ****/
select * from tmp_jieguo
--删除临时表
drop table tmp_jieguo,tmp_lxr
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
御俊明kY
2012-01-27
知道答主
回答量:14
采纳率:0%
帮助的人:12.3万
展开全部
导入到临时表后,先用交叉表——形成横向排列,然后,再将数据追加到正式表/
再判ID/
表一是项目,这些项目是相对固定的,即并不经常变化,最主要的是每个人都有相同的项(可以值为0),因此,可以根据表一的项动态生成一个你需要的那个横向表(叫作表三吧),使用表一中的项目ID作字段名即可.平时的数据就存放在表三里(表二不再需要),你所要求的修改和显示都很好实现,而且效率要高得多.
当表一的项增/删时,修改表三的结构即可,以后你的查询串则根据表一生成.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
longdrang
2012-01-26
知道答主
回答量:9
采纳率:0%
帮助的人:7812
展开全部
一条SQL语句应该是没办法。因为同一个ID其对应的联系人和联系方式的个数是不固定的,可以用函数的方式按ID值将联系人和联系方式组装成一个长字符串返回。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式