读书人

SQL中怎么让两条结果变成一条

发布时间: 2012-03-08 13:30:13 作者: rapoo

SQL中如何让两条结果变成一条?
有表如下
客户资料表
ID NAME
10 张三
11 李四
12 王五

关系对应表(ClientIDm,GuanXi_ID都是客户资料表中的ID)
AutoID ClientID GuanXi_ID
1 10 11
2 11 12

关系明细表
GuanXiDetailID(对应的是关系对应表的AutoID) MiaoShu(描述)
1 朋友
1 同事
2 兄弟

相得出的结果如下:
ClientID 客户姓名 关系人姓名 存在关系
10 张三 李四 [朋友][同事]
11 李四 王五 [兄弟]

--存在关系,这个地方,如果关系明细表中存在三种或更多的关系,应该显示如[1][2][3]或更多


[解决办法]

SQL code
------------------------------ Author  :fredrickhu(小F,向高手学习)-- Date    :2011-12-23 15:19:48-- Version:--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) --    Apr 22 2011 11:57:00 --    Copyright (c) Microsoft Corporation--    Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)--------------------------------> 测试数据:[客户资料表]if object_id('[客户资料表]') is not null drop table [客户资料表]go create table [客户资料表]([ID] int,[NAME] varchar(4))insert [客户资料表]select 10,'张三' union allselect 11,'李四' union allselect 12,'王五'--> 测试数据:[关系对应表]if object_id('[关系对应表]') is not null drop table [关系对应表]go create table [关系对应表]([AutoID] int,[ClientID] int,[GuanXi_ID] int)insert [关系对应表]select 1,10,11 union allselect 2,11,12--> 测试数据:[关系明细表]if object_id('[关系明细表]') is not null drop table [关系明细表]go create table [关系明细表]([GuanXiDetailID] int,[MiaoShu] varchar(4))insert [关系明细表]select 1,'朋友' union allselect 1,'同事' union allselect 2,'兄弟'--------------开始查询--------------------------; with f as(select  a.id,a.name as 客户姓名,b.name as 关系人姓名,d.MiaoShu as 存在关系from  客户资料表 a,客户资料表 b,关系对应表 c,关系明细表 dwhere  a.ID=c.ClientID  and c.AutoID=d.GuanXiDetailIDand  b.ID=c.GuanXi_ID ) select id, 客户姓名 ,关系人姓名,[存在关系]=stuff((select ','+[存在关系] from f where id=t.id for xml path('')), 1, 1, '') from f t group by id, 客户姓名 ,关系人姓名----------------结果----------------------------/* id          客户姓名 关系人姓名 存在关系----------- ---- ----- ----------------------------------------------------------------------------------------------------------------10          张三   李四    朋友,同事11          李四   王五    兄弟(2 行受影响)*/
[解决办法]
SQL code
if object_id('客户资料表') is not null   drop table 客户资料表gocreate table 客户资料表( id int, name varchar(10))goinsert into 客户资料表select 10,'张三' union allselect 11,'李四' union allselect 12,'王五'goif object_id('关系对应表') is not null   drop table 关系对应表gocreate table 关系对应表( AutoID int, ClientID int, GuanXi_ID int)goinsert into 关系对应表select 1,10,11 union allselect 2,11,12goif object_id('关系明细表') is not null   drop table 关系明细表gocreate table 关系明细表( GuanXiDetailID int, MiaoShu varchar(10))goinsert into 关系明细表select 1,'朋友' union allselect 1,'同事' union allselect 2,'兄弟'goselect ClientID,客户姓名=b.Name,关系人姓名=c.Name,存在关系=(select '['+MiaoShu+']' from 关系明细表 where GuanXiDetailID=d.GuanXiDetailID for xml path(''))from 关系对应表 a inner join 客户资料表 b on a.ClientID=b.ID                   inner join 客户资料表 c on a.GuanXi_ID=c.ID                  inner join 关系明细表 d on a.AutoID=d.GuanXiDetailIDgroup by ClientID,b.Name,c.Name,d.GuanXiDetailIDgo/*ClientID    客户姓名       关系人姓名      存在关系----------- ---------- ---------- ----------------------------------------------------------------------------------------------------------------10          张三         李四         [朋友][同事]11          李四         王五         [兄弟](2 行受影响)*/ 


[解决办法]
稍改小F的

SQL code
--> 测试数据:[客户资料表]if object_id('[客户资料表]') is not null drop table [客户资料表]go create table [客户资料表]([ID] int,[NAME] varchar(4))insert [客户资料表]select 10,'张三' union allselect 11,'李四' union allselect 12,'王五'--> 测试数据:[关系对应表]if object_id('[关系对应表]') is not null drop table [关系对应表]go create table [关系对应表]([AutoID] int,[ClientID] int,[GuanXi_ID] int)insert [关系对应表]select 1,10,11 union allselect 2,11,12--> 测试数据:[关系明细表]if object_id('[关系明细表]') is not null drop table [关系明细表]go create table [关系明细表]([GuanXiDetailID] int,[MiaoShu] varchar(4))insert [关系明细表]select 1,'朋友' union allselect 1,'同事' union allselect 2,'兄弟'--------------开始查询--------------------------; with f as(select  a.id,a.name as 客户姓名,b.name as 关系人姓名,d.MiaoShu as 存在关系from  客户资料表 a,客户资料表 b,关系对应表 c,关系明细表 dwhere  a.ID=c.ClientID  and c.AutoID=d.GuanXiDetailIDand  b.ID=c.GuanXi_ID ) select id, 客户姓名 ,关系人姓名,[存在关系]=stuff((select ' '+QUOTENAME([存在关系]) from f where id=t.id for xml path('')), 1, 1, '')  from f t group by id, 客户姓名 ,关系人姓名id          客户姓名 关系人姓名 存在关系----------- ---- ----- ----------------------------------------------------------------------------------------------------------------10          张三   李四    [朋友] [同事]11          李四   王五    [兄弟](2 行受影响)
[解决办法]
SQL code
create table #a(  id int,  name nvarchar(50))insert #aselect 10,'张三' union allselect 11,'李四' union allselect 12,'王五'Create table #b(  AutoID int,  ClientID int,  GuanXi_ID int )  insert #b  select 1,10,11    union all select 2,11,12  create table #c (   GuanXiDetailID int,   MiaoShu nvarchar(50) )  insert #c select 1,'朋友' union all select 1,'同事' union all select 2,'兄弟'   select ClientID,aa.name,ab.name,MiaoShu='['+stuff((select  '['+MiaoShu+']' from #c t where GuanXiDetailID = b.AutoID for xml path('')) , 1 , 1 , '') from #b b left join #a aa on aa.id=b.ClientID left join #a ab on ab.id=b.GuanXi_ID drop table #a,#b,#c--10    张三    李四    [朋友][同事]--11    李四    王五    [兄弟]
[解决办法]
SQL code
--> 测试数据:[客户资料表]if object_id('[客户资料表]') is not null drop table [客户资料表]go create table [客户资料表]([ID] int,[NAME] varchar(4))insert [客户资料表]select 10,'张三' union allselect 11,'李四' union allselect 12,'王五'--> 测试数据:[关系对应表]if object_id('[关系对应表]') is not null drop table [关系对应表]go create table [关系对应表]([AutoID] int,[ClientID] int,[GuanXi_ID] int)insert [关系对应表]select 1,10,11 union allselect 2,11,12--> 测试数据:[关系明细表]if object_id('[关系明细表]') is not null drop table [关系明细表]go create table [关系明细表]([GuanXiDetailID] int,[MiaoShu] varchar(4))insert [关系明细表]select 1,'朋友' union allselect 1,'同事' union allselect 2,'兄弟'--------------开始查询--------------------------; with f as(select  a.id,a.name as 客户姓名,b.name as 关系人姓名,d.MiaoShu as 存在关系from  客户资料表 a,客户资料表 b,关系对应表 c,关系明细表 dwhere  a.ID=c.ClientID  and c.AutoID=d.GuanXiDetailIDand  b.ID=c.GuanXi_ID ) select id, 客户姓名 ,关系人姓名,[存在关系]=stuff((select ' '+QUOTENAME([存在关系]) from f where id=t.id for xml path('')), 1, 1, '')  from f t group by id, 客户姓名 ,关系人姓名id          客户姓名 关系人姓名 存在关系----------- ---- ----- ----------------------------------------------------------------------------------------------------------------10          张三   李四    [朋友] [同事]11          李四   王五    [兄弟] 

读书人网 >SQL Server

热点推荐