先有一个表TB如下:name age sex
a 18 1
b 20 2
c 18 1
d 20 1
e 18 2
f 20 2现在需要查出的结果是
age names
18 a,c,e
20 b,d,f请问用语句怎么实现?
a 18 1
b 20 2
c 18 1
d 20 1
e 18 2
f 20 2现在需要查出的结果是
age names
18 a,c,e
20 b,d,f请问用语句怎么实现?
解决方案 »
- SQL server
- 累积的问题:数据库中两字段匹配率问题。
- 求一个SQL语句 对LEFT JOIN 出来的 NULL 右表 赋0值 在线等解决就揭
- 问题1:怎样更改表的创建时间?问题2:怎样监测表的数据被改动过
- 有条件的多表间数据插入问题-请各位高手指点
- 数据库范式------- 求解!!!
- [前辈]数据库并发问题
- 想到头爆: 有一个大型中英文电子商务网站, 是用一个数据库好呢? 还是用两个数据库好呢? 哪位大哥指点一下! 谢谢!!!
- 在自己的应用程序中如何及时获得数据库中数据被修改的信息? (在线等候)
- SQL:group by with rollup 如何使用?
- 小小问题
- 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. 新的解决方法(适用于2005及以后版本)
-- 示例数据
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 行受影响)
--*/CSDN 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为
drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中
DECLARE @T TABLE (name VARCHAR(1),age INT,sex INT)
INSERT INTO @T
SELECT 'a',18,1 UNION ALL
SELECT 'b',20,2 UNION ALL
SELECT 'c',18,1 UNION ALL
SELECT 'd',20,1 UNION ALL
SELECT 'e',18,2 UNION ALL
SELECT 'f',20,2--SQL查询如下:SELECT
A.age,
name=B.name.value('(/Row)[1]','varchar(50)')
FROM (
SELECT DISTINCT
age
FROM @T
) AS A
CROSS APPLY
(
SELECT
(
SELECT
name
FROM @T
WHERE age=A.age
ORDER BY sex,name
FOR XML PATH('Row'),TYPE
).query('
<Row>
{
for $name in /Row[position()<last()]
return concat(string($name/name[1]),",")
}
{string((/Row[last()]/name)[1])}
</Row>
') AS name
) AS B/*
age name
----------- --------------------------------------------------
18 a, c,e
20 d, b,f(2 行受影响)*/
name age sex
a 18 1
b 20 2
c 18 1
d 20 1
e 18 2
f 20 2 现在需要查出的结果是
age names
18 a,c,e
20 b,d,f
*/create table RR
(
[name] varchar(20),
age int,
sex int
)
insert into RR select 'a',18,1
insert into RR select 'b',20,2
insert into RR select 'c',18,1
insert into RR select 'd',20,1
insert into RR select 'e',18,2
insert into RR select 'f',20,2create function dbo.FC_Str1(@age int)
returns varchar(100)
as
begin
declare @i varchar(100)
set @i=''
select @i=@i+','+[name] from RR where age=@age
return stuff(@i,1,1,'')
endselect age,dbo.FC_Str1(age) from RR group by age
create table t(name varchar(1),age int,sex int)
insert t(name,age,sex)
select 'a',18,1 union all
select 'b',20,2 union all
select 'c',18,1 union all
select 'd',20,1 union all
select 'e',18,2 union all
select 'f',20,2 create function str_fun(@age nvarchar(40))
returns nvarchar(100)
begin
declare @str nvarchar(200)
select @str=isnull(@str+',','') + name from t where age=@age
return @str
endselect age,dbo.str_fun(age)as names from t group by age
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
-- Author: happyflystone
-- Date:2008-12-27 22:53:15
-------------------------------------- Test Data: TA
IF OBJECT_ID('TA') IS NOT NULL
DROP TABLE TA
Go
CREATE TABLE TA(name NVARCHAR(1),age INT,sex INT)
Go
INSERT INTO TA
SELECT 'a',18,1 UNION ALL
SELECT 'b',20,2 UNION ALL
SELECT 'c',18,1 UNION ALL
SELECT 'd',20,1 UNION ALL
SELECT 'e',18,2 UNION ALL
SELECT 'f',20,2
GO
--Start
SELECT
age,[name]=replace(replace(replace((select [name]
from ta
where age = a.age for xml auto),
'"/><ta name="',','),'<ta name="',''),'"/>','')
FROM
TA a
group by age
--Result:
/*age name
----------- ----------------------------------------
18 a,c,e
20 b,d,f(2 行受影响)
*/
--End
INSERT INTO tb
SELECT 'a',18,1 UNION ALL
SELECT 'b',20,2 UNION ALL
SELECT 'c',18,1 UNION ALL
SELECT 'd',20,1 UNION ALL
SELECT 'e',18,2 UNION ALL
SELECT 'f',20,2
select * from tbselect age,names = stuff((select ','+ name from tb where age = a.age for xml path('')),1,1,'' )from tb a group by age
age names
----------- ----------------------------------------------------
18 a,c,e
20 b,d,f(2 row(s) affected)
INSERT INTO tb
SELECT 'a',18,1 UNION ALL
SELECT 'b',20,2 UNION ALL
SELECT 'c',18,1 UNION ALL
SELECT 'd',20,1 UNION ALL
SELECT 'e',18,2 UNION ALL
SELECT 'f',20,2
select * from tbselect age,names = stuff((select ','+ name from tb where age = a.age for xml path('')),1,1,'' )from tb a group by age
age names
----------- ---------------------
18 a,c,e
20 b,d,f(2 row(s) affected)
SQL code
create table Tb(name nvarchar(1),age int,sex int)
INSERT INTO tb
SELECT 'a',18,1 UNION ALL
SELECT 'b',20,2 UNION ALL
SELECT 'c',18,1 UNION ALL
SELECT 'd',20,1 UNION ALL
SELECT 'e',18,2 UNION ALL
SELECT 'f',20,2
select * from tbselect age,names = stuff((select ','+ name from tb where age = a.age for xml path('')),1,1,'' )from tb a group by age
age names
----------- ---------------------
18 a,c,e
20 b,d,f