项目信息表A 项目编号: 项目名称: 城市 样本量 PM 时间
gz_234 xxxx a 2880 b 2009-12-12 流程表B 项目编号 流程ID 流程名称 负责人 是否启动
gz_234 a1 g aa 1
gz_234 a2 b bb 0
gz_234 a3 c cc 1 两张表合并 输出这样的信息: 项目编号 项目基本信息(这里其实就是一列) 流程基本信息(是否启动来判断,是1则可以)
gz_234 项目名称: xxxx ;城市 :a;样本量:2880;时间:2009-12-29; PM b; 流程ID a1; a2 ;a3 流程名称 g;b;c 负责人:aa;bb;cc
gz_234 xxxx a 2880 b 2009-12-12 流程表B 项目编号 流程ID 流程名称 负责人 是否启动
gz_234 a1 g aa 1
gz_234 a2 b bb 0
gz_234 a3 c cc 1 两张表合并 输出这样的信息: 项目编号 项目基本信息(这里其实就是一列) 流程基本信息(是否启动来判断,是1则可以)
gz_234 项目名称: xxxx ;城市 :a;样本量:2880;时间:2009-12-29; PM b; 流程ID a1; a2 ;a3 流程名称 g;b;c 负责人:aa;bb;cc
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-12-28 20:14:20
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[A]
if object_id('[A]') is not null drop table [A]
go
create table [A]([项目编号] varchar(6),[项目名称] varchar(4),[城市] varchar(1),[样本量] int,[PM] varchar(1),[时间] datetime)
insert [A]
select 'gz_234','xxxx','a',2880,'b','2009-12-12'
--> 测试数据:[B]
if object_id('[B]') is not null drop table [B]
go
create table [B]([项目编号] varchar(6),[流程ID] varchar(2),[流程名称] varchar(1),[负责人] varchar(2),[是否启动] int)
insert [B]
select 'gz_234','a1','g','aa',1 union all
select 'gz_234','a2','b','bb',0 union all
select 'gz_234','a3','c','cc',1
--------------开始查询--------------------------
;with f as
(
select a.*,b.流程ID,b.流程名称,b.负责人,b.是否启动 from a join b on a.项目编号=b.项目编号
)
select
项目编号,项目名称,城市,样本量,PM,时间,
[流程ID]=stuff((select ','+[流程ID] from f t where 项目编号=f.项目编号 for xml path('')), 1, 1, ''),
[负责人]=stuff((select ','+[负责人] from f t where 项目编号=f.项目编号 for xml path('')), 1, 1, '')
from
f
group by
项目编号,项目名称,城市,样本量,PM,时间
----------------结果----------------------------
/* 项目编号 项目名称 城市 样本量 PM 时间 流程ID 负责人
------ ---- ---- ----------- ---- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
gz_234 xxxx a 2880 b 2009-12-12 00:00:00.000 a1,a2,a3 aa,bb,cc(1 行受影响)
*/
合并列值
--*******************************************************************************************
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc 需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加) 1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--=============================================================================
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
--1. 创建处理函数
CREATE FUNCTION dbo.f_strUnite(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id
drop table tb
drop function dbo.f_strUnite
go
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
--===================================================================================
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), ' <N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb /*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc (2 行受影响)
*/ --SQL2005中的方法2
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id /*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc (2 row(s) affected) */ drop table tb
insert [A]
select 'gz_234','xxxx','a',2880,'b','2009-12-12'
create table [B]([项目编号] varchar(6),[流程ID] varchar(2),[流程名称] varchar(1),[负责人] varchar(2),[是否启动] int)
insert [B]
select 'gz_234','a1','g','aa',1 union all
select 'gz_234','a2','b','bb',0 union all
select 'gz_234','a3','c','cc',1
gocreate function dbo.f_str1(@项目编号 varchar(6)) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ';' + cast(流程名称 as varchar) from B where 项目编号 = @项目编号
set @str = right(@str , len(@str) - 1)
return @str
end
go
create function dbo.f_str2(@项目编号 varchar(6)) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ';' + cast(流程ID as varchar) from B where 项目编号 = @项目编号
set @str = right(@str , len(@str) - 1)
return @str
end
go
create function dbo.f_str3(@项目编号 varchar(6)) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ';' + cast(负责人 as varchar) from B where 项目编号 = @项目编号
set @str = right(@str , len(@str) - 1)
return @str
end
go--调用函数
select m.项目编号 ,
项目基本信息 = '项目编号:' + m.项目编号 + ';' +
'城市:' + m.城市 + ';' +
'样本量:' + cast(m.样本量 as varchar) + ';' +
'时间:' + convert(varchar(10),时间,120) + ';' +
'PM:' + PM + ';',
n.流程基本信息 from a m,
(select 项目编号 , 流程基本信息='流程ID:'+dbo.f_str1(项目编号)+' 流程名称:'+dbo.f_str2(项目编号)+' 负责人:'+dbo.f_str3(项目编号) from B group by 项目编号) n
where m.项目编号 = n.项目编号drop table a , b
drop function dbo.f_str1
drop function dbo.f_str2
drop function dbo.f_str3/*
项目编号 项目基本信息 流程基本信息
------ ---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
gz_234 项目编号:gz_234;城市:a;样本量:2880;时间:2009-12-12;PM:b; 流程ID:g;b;c 流程名称:a1;a2;a3 负责人:aa;bb;cc(所影响的行数为 1 行)
*/