日期:2014-05-18  浏览次数:20643 次

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 all
select 11,'李四' union all
select 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 all
select 2,11,12
--> 测试数据:[关系明细表]
if object_id('[关系明细表]') is not null drop table [关系明细表]
go 
create table [关系明细表]([GuanXiDetailID] int,[MiaoShu] varchar(4))
insert [关系明细表]
select 1,'朋友' union all
select 1,'同事' union all
select 2,'兄弟'
--------------开始查询--------------------------
; with f as
(
select
  a.id,a.name as 客户姓名,b.name as 关系人姓名,d.MiaoShu as 存在关系
from
  客户资料表 a,客户资料表 b,关系对应表 c,关系明细表 d
where
  a.ID=c.ClientID  and c.AutoID=d.GuanXiDetailID
and
  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 客户资料表
go
create table 客户资料表
(
 id int,
 name varchar(10)
)
go
insert into 客户资料表
select 10,'张三' union all
select 11,'李四' union all
select 12,'王五'
go
if object_id('关系对应表') is not null
   drop table 关系对应表
go
create table 关系对应表
(
 AutoID int,
 ClientID int,
 GuanXi_ID int
)
go
insert into 关系对应表
select 1,10,11 union all
select 2,11,12
go
if object_id('关系明细表') is not null
   drop table 关系明细表
go
create table 关系明细表
(
 GuanXiDetailID int,
 MiaoShu varchar(10)
)
go
insert into 关系明细表
select 1,'朋友' union all
select 1,'同事' union all
select 2,'兄弟'
go
select 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.GuanXiDetailID
group by ClientID,b.Name,c.Name,d.GuanXiDetailID
go
/*
ClientID    客户姓名       关系人姓名      存在关系
----------- ---------- ---------- ----------------------------------------------------------------------------------------------------------------
10          张三         李四         [朋友][同事]
11          李四         王五         [兄弟]

(2 行受影响)
*/