日期:2014-05-19  浏览次数:20510 次

菜鸟提问:如何按照某个字段值的一部分进行分组
例如,一个表中有一个字段name,它的值可能以下几种:  
刘德华发文,刘德华收文,张学友发文,张学友收文,刘德华信件,张学友信笺...

如何使得查询结果按照如下排序:
全部的发问,然后是全部的收文,最后信笺.

sql怎么写呢?

------解决方案--------------------
拆分字符串,然后再汇总,
select a.* from
(
select id,name from table group by id,right(name,2)
) b
inner join
table a
on a.id=b.id
------解决方案--------------------
select * from tbName
order by case when charindex( '发文 ', name)> 0 then 1
when charindex( '收文 ', name)> 0 then 2
when charindex( '信笺 ', name)> 0 then 3 end
------解决方案--------------------
Create Table TEST
(name Nvarchar(20))
Insert TEST Select N '刘德华发文 '
Union All Select N '刘德华收文 '
Union All Select N '张学友发文 '
Union All Select N '张学友收文 '
Union All Select N '刘德华信件 '
Union All Select N '张学友信笺 '
GO
--方法一
Select * From TEST Order By (Case Right(name, 2) When N '发文 ' Then 0 When N '收文 ' Then 1 When N '信笺 ' Then 2 End)
--方法二
Select * From TEST Order By CharIndex(Right(name, 2), N '发文收文信笺 ')
GO
Drop Table TEST
/*
name
刘德华信件
刘德华发文
张学友发文
张学友收文
刘德华收文
张学友信笺
*/
------解决方案--------------------
declare @a varchar(8000)
declare @b int
declare @c int
declare @d int
declare @e varchar(8000)
declare @x varchar(8000)
declare @y varchar(8000)
declare @z varchar(8000)
set @x= ' '
set @y= ' '
set @z= ' '

set @a = '刘德华发文,刘德华收文,张学友发文,张学友收文,刘德华信件,张学友信笺 '
set @b =len(@a)
set @c =1
while(charindex( ', ',@a,@c)> 0)
begin
set @d =charindex( ', ',@a,@c)
set @e =substring(@a,@c,@d-@c)
set @c =@d+1
select @e
if right(@e,1)= '文 '
begin
if right(@e,2)= '发文 '
set @x=@x+@e+ ', '
if right(@e,2)= '收文 '
set @y=@y+@e+ ', '
end
else
set @z=@z+@e+ ', '
end
set @a=@x+@y+@z+substring(@a,@c,@b-@c+1)
select @a