表 TABtable TAB
a b c
------------------
1 p 2009年3月
2 p 2009年4月
3 b 2009年8月
4 d 2009年1月
5 d 2009年2月
写个sql
得到下面的表
a b c
------------------
1 p 2009年3月、2009年4月
3 b 2009年8月
4 d 2009年1月、2009年2月
a b c
------------------
1 p 2009年3月
2 p 2009年4月
3 b 2009年8月
4 d 2009年1月
5 d 2009年2月
写个sql
得到下面的表
a b c
------------------
1 p 2009年3月、2009年4月
3 b 2009年8月
4 d 2009年1月、2009年2月
表结构,数据如下:
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中只能用函数解决。)
--1. 创建处理函数
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 CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO -- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id drop table tb
drop function dbo.f_str /*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/ --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 --创建一个合并的函数
create function f_hb(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return(@str)
End
go --调用自定义函数得到结果:
select distinct id ,dbo.f_hb(id) as value from tb drop table tb
drop function dbo.f_hb /*
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
if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(id int,corpname varchar(10),salebrand varchar(10))
insert tb
select
1, 'p', '2009年3月' union all select
2, 'p', '2009年4月' union all select
3, 'b', '2009年8月' union all select
4, 'd', '2009年1月' union all select
5, 'd', '2009年2月'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@corpname nvarchar(100))
returns nvarchar(100)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+salebrand from tb where corpname=@corpname
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
where
not exists(select 1 from tb where corpname=a.corpname and id>a.id)
/*
id corpname 结果
2 p 2009年3月,2009年4月
3 b 2009年8月
5 d 2009年1月,2009年2月
*/
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-11 16:40:20.233●●●●●
★★★★★soft_wsx★★★★★
*/
--select GETDATE()
select a.*,b.*
from vip a left join (
SELECT *
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=;Password=;Extended properties=Excel 8.0')...pos$
)b on a.id=b.id
--"c:\book1.xls" 为文件所在路径
--2
SELECT * into #pos
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=;Password=;Extended properties=Excel 8.0')...pos$
select a.*,b.*
from vip a left join #pos b
on a.id=b.id这才是对的
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-04 15:19:28.123●●●●●
★★★★★soft_wsx★★★★★
*/if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(id int,corpname varchar(10),salebrand varchar(10))
insert tb
select
1, 'p', '2009年3月' union all select
2, 'p', '2009年4月' union all select
3, 'b', '2009年8月' union all select
4, 'd', '2009年1月' union all select
5, 'd', '2009年2月'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@corpname nvarchar(100))
returns nvarchar(100)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+salebrand from tb where corpname=@corpname
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
where
not exists(select 1 from tb where corpname=a.corpname and id<a.id)
/*
id corpname 结果
1 p 2009年3月,2009年4月
3 b 2009年8月
4 d 2009年1月,2009年2月
*/if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(id int,corpname varchar(10),salebrand varchar(10))
insert tb
select
1, 'p', '2009年3月' union all select
2, 'p', '2009年4月' union all select
3, 'b', '2009年8月' union all select
4, 'd', '2009年1月' union all select
5, 'd', '2009年2月'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@corpname nvarchar(100))
returns nvarchar(100)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+salebrand from tb where corpname=@corpname
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
where
not exists(select 1 from tb where corpname=a.corpname and id<a.id)
/*
id corpname 结果
1 p 2009年3月,2009年4月
3 b 2009年8月
4 d 2009年1月,2009年2月
*/又错了