有如下一个数据表类型 名称 品牌
------------------
A 啤酒 雪花B 手机 苹果
B 手机 三星C 香烟 泰山
C 美女 日本
C 美女 国产要求建一个这样的视图,就是把类型相同的,名称和品牌各自合并,用‘,’隔开类型 名称 品牌
--------------------------------
A 啤酒 雪花
B 手机 苹果,三星
C 香烟,美女 泰山,日本,国产
------------------
A 啤酒 雪花B 手机 苹果
B 手机 三星C 香烟 泰山
C 美女 日本
C 美女 国产要求建一个这样的视图,就是把类型相同的,名称和品牌各自合并,用‘,’隔开类型 名称 品牌
--------------------------------
A 啤酒 雪花
B 手机 苹果,三星
C 香烟,美女 泰山,日本,国产
解决方案 »
- 存储过程查询id维护表,根据返回值设置信息表id,
- 关于数据库的一些基本问题
- sql安装的问题,提示安装程序配置服务器失败。参考错误日志和C:\WINDOWS\SQLSTP.LOG了解更多信息
- 如何在插入记录的时候得知自增量标识列的值?(谢谢)
- 连接数据库的问题
- SQL触发器问题 同一个表中的一个字段变化时,另一个字段进行变化
- sql问题:高分等你拿(300)!!!!!!!!!!!!!
- 各位已参加工作的朋友们……
- sql存储过程中想通过参数动态的取n条纪录,通不过 ?请求解决方法
- 如何获取SQL Server表的字段属性(马上给分)
- SQL server2005 循环删除100个表
- sqlserver数据库在表分区方面还有很长的路啊
if object_id('[tb]') is not null drop table [tb]
create table [tb] (类型 varchar(1),名称 varchar(4),品牌 varchar(4))
insert into [tb]
select 'A','啤酒','雪花' union all
select 'B','手机','苹果' union all
select 'B','手机','三星' union all
select 'C','香烟','泰山' union all
select 'C','美女','日本' union all
select 'C','美女','国产'
go--sql2005
create view v_wsp
as
select 类型,名称=stuff((select ','+名称 from tb where 类型=a.类型 for xml path('')),1,1,''),
品牌=stuff((select ','+品牌 from tb where 类型=a.类型 for xml path('')),1,1,'')
from tb a
group by 类型
goselect * from v_wsp
--sql2000要使用合并函数
CREATE FUNCTION f_str(@类型 varchar(50),@type int)
RETURNS varchar(100)
AS
BEGIN
DECLARE @r varchar(8000)
SELECT @r = isnull(@r + ',','') + case @type when 1 then 名称 else 品牌 end FROM tb WHERE 类型=@类型
RETURN @r
END
GO--使用
select 类型,名称=dbo.f_str(类型,1),品牌=dbo.f_str(类型,2) from tb group by 类型
--*******************************************************************************************
表结构,数据如下:
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
if object_id('[tb]') is not null drop table [tb]
create table [tb] (类型 varchar(1),名称 varchar(4),品牌 varchar(4))
insert into [tb]
select 'A','啤酒','雪花' union all
select 'B','手机','苹果' union all
select 'B','手机','三星' union all
select 'C','香烟','泰山' union all
select 'C','美女','日本' union all
select 'C','美女','国产'
go--sql2005
create view v_wsp
as
select 类型,名称=stuff((select ','+名称 from tb where 类型=a.类型 for xml path('')),1,1,''),
品牌=stuff((select ','+品牌 from tb where 类型=a.类型 for xml path('')),1,1,'')
from tb a
group by 类型
goselect * from v_wsp