日期:2014-05-18 浏览次数:20696 次
create table myl
(name varchar(8), code varchar(8), level varchar(6))
insert into myl
select '小刘', '020315', '严重' union all
select '小刘', '020316', '严重' union all
select '小刘', '020100', '一般' union all
select '小王', '020100', '一般' union all
select '小张', '020316', '严重' union all
select '小张', '020101', '一般' union all
select '小李', '', ''
select a.name,
       stuff((select ','+b.code from myl b where a.name=b.name for xml path('')),1,1,'') as 'code',
       case min(level) when '' then '无' else min(level) end as 'level'
from myl a
group by a.name
name     code                     level
-------- ----------------------- ------
小李                                  无
小刘       020315,020316,020100    严重
小王       020100                  一般
小张       020316,020101           严重
(4 row(s) affected)
------解决方案--------------------
SQL2000写法,
create table myl
(name varchar(8), code varchar(8), level varchar(6))
insert into myl
select '小刘', '020315', '严重' union all
select '小刘', '020316', '严重' union all
select '小刘', '020100', '一般' union all
select '小王', '020100', '一般' union all
select '小张', '020316', '严重' union all
select '小张', '020101', '一般' union all
select '小李', '', ''
create function dbo.fn_myl
(@name varchar(8))
returns varchar(6000)
as
begin
 declare @codes varchar(6000)=''
 select @codes=@codes+code+','
   from myl where name=@name
 select @codes=left(@codes,len(@codes)-1)
 return @codes
end
select name,
       dbo.fn_myl(name) as 'code',
       case min(level) when '' then '无' else min(level) end as 'level'
from myl
group by name
name     code                      level
-------- ------------------------- ------
小李                                    无
小刘       020315,020316,020100      严重
小王       020100                    一般
小张       020316,020101             严重
(4 row(s) affected)
------解决方案--------------------
[Quote=引用:]
高手们,我用的是SQLServer2000
[/Quote]
--> 测试数据:[ta]
if object_id('[ta]') is not null drop table [ta]
go 
create table [ta]([name] varchar(4),[code] varchar(6),[level] varchar(4))
insert [ta]
select '小刘','020315','严重' union all
select '小刘','020316','严重' union all
select '小刘','020100','一般' union all
select '小王','020100','一般' union all
select '小张','020316','严重' union all
select '小张','020101','一般' union all
select '小李',null,null
--------------开始查询--------------------------
if object_id('F_Str') is not null 
    drop function F_Str 
go 
create function F_Str(@name varchar(10)) 
returns nvarchar(50) 
as 
begin 
    declare @s nvarchar(100) 
    select @s=isnull(@S+',','')+[code]  from [ta] where [name]=@name
    return @s 
end 
go 
select [name],dbo.F_Str([name]),isnull(min([level]),'无')
from ta
group by [name]
go 
----------------结果----------------------------
/* 
name                                                    
---- -------------------------------------------------- ----
小李   NULL                                               无
小刘   020315,020316,020100                               严重
小王   020100                                             一般
小张   020316,020101                                      严重
(4 行受影响)
*/