create funtion f_str(@keya varchar(10))
returns varchar(100)
as
begin
declare @s varchar(100)
select @s = isnull(@s+'+','') + p_type from tb where key_a = @keya
return @s
end
go
select a.* ,dbo.f_str(a.key_a)
from ta
returns varchar(100)
as
begin
declare @s varchar(100)
select @s = isnull(@s+'+','') + p_type from tb where key_a = @keya
return @s
end
go
select a.* ,dbo.f_str(a.key_a)
from ta
解决方案 »
- 刚开始学sql server,遇到建表的问题?
- 为什么安装sql server2000时,总是会提示“以前的某个程序安装已经在计算机上创建挂起的文件操作,必须重启计算机"
- 如何判断存储过程是否正在运行(没分了,请谅解)
- 如何使用存储过程的结果?
- SQLSERVER 2000越备份越小!!!
- 查询一天中每个小时内销售数量与总数比的问题
- Sql服务器设置急问
- 大表建立replication,每个表都百万行以上
- SQL随机问题
- 如果在SQLServer里面获得错误信息(注:不是错误信息代码)
- 在数据库服务器上数据文件将包含有2个RAID阵列
- 根据记录时间(Time1)48小时后自动更新(Time2)如果实现?
-- Author:Flystone
-- Version:V1.001 Date:2008-05-15 初稿
-- Version:V1.002 Date:2008-05-16 1、 处理空格带来的异常
-- 2、 增加了形如yyyy-mm-dd hh:mm:ss
-- yyyy-m-d h:m:s 格式的处理
*/-- Test Data: ta
If object_id('ta') is not null
Drop table ta
Go
Create table ta(key_a varchar(5),type varchar(3))
Go
Insert into ta
select 'a0001','sub' union all
select 'a0002','sub'
Go
-- Test Data: tB
If object_id('tB') is not null
Drop table tB
Go
Create table tB(key_a varchar(5),key_b int,p_type varchar(4))
Go
Insert into tB
select 'a0001',01,'py01' union all
select 'a0001',02,'py03' union all
select 'a0002',01,'py01' union all
select 'a0002',02,'py03'
Go
--Start
create function f_str(@keya varchar(10))
returns varchar(100)
as
begin
declare @s varchar(100)
select @s = isnull(@s+'+','') + p_type from tb where key_a = @keya
return @s
end
go
select a.* ,dbo.f_str(a.key_a)
from ta a
drop function f_str--Result:
/*key_a type
----- ---- ----------
a0001 sub py01+py03
a0002 sub py01+py03(所影响的行数为 2 行)
*/
--End
没有表述清楚,小鸟恐怕无法满足楼主要求。
a b
1 1
1 2
1 3
2 1
2 2
3 1
--如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1 create table tb
(
a int,
b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
goif object_id('pubs..f_hb') is not null
drop function f_hb
go--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(b as varchar) from tb where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tbdrop table tb--结果
a b
----------- ------
1 1,2,3
2 1,2
3 1(所影响的行数为 3 行)
多个前列的合并
数据的原始状态如下:
ID PR CON OP SC
001 p c 差 6
001 p c 好 2
001 p c 一般 4
002 w e 差 8
002 w e 好 7
002 w e 一般 1
===========================
用SQL语句实现,变成如下的数据
ID PR CON OPS
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1)if object_id('pubs..tb') is not null
drop table tb
gocreate table tb
(
id varchar(10),
pr varchar(10),
con varchar(10),
op varchar(10),
sc int
)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '差', 6)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '好', 2)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '一般', 4)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '差', 8)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '好', 7)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '一般', 1)
goif object_id('pubs..test') is not null
drop table test
go
select ID,PR,CON , OPS = op + '(' + cast(sc as varchar(10)) + ')' into test from tb--创建一个合并的函数
if object_id('pubs..f_hb') is not null
drop function f_hb
go
create function f_hb(@id varchar(10),@pr varchar(10),@con varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(OPS as varchar) from test where id = @id and @pr = pr and @con = con
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct id ,pr , con , dbo.f_hb(id,pr,con) as OPS from testdrop table tb
drop table test--结果
id pr con OPS
---------- ---------- ---------- -------------------
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1)(所影响的行数为 2 行)create table b
(col varchar(20))insert b values ('a')
insert b values ('b')
insert b values ('c')
insert b values ('d')
insert b values ('e')
declare @sql varchar(1024)
set @sql=''
select @sql=@sql+b.col+',' from (select col from b) as b
set @sql='select '''+@sql+''''
exec(@sql)
问题描述:无论是在sql 2000, 还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以, 当我们在处理下列要求时,会比较麻烦:
有表tb, 如下: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. 旧的解决方法
-- 1. 创建处理函数
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, values=dbo.f_str(id)
FROM tb
GROUP BY id-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/附: 合并与分拆的CLR, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为 drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中