假设有一个表 keyb 里面字段如下: key count
大学+教育 5
计算机+书本 1
大学生+吃饭 3
书本+计算机 3
保安+学生 8
教育+大学 12怎么样处理成
key count
大学+教育 17
计算机+书本 4
大学生+吃饭 3
保安+学生 8
也就是说计算 判断 key 的回文(比如 大学+教育 等同于 教育+大学 来统计后面的 count )
sql 语句应该怎么写?
万分感谢@
大学+教育 5
计算机+书本 1
大学生+吃饭 3
书本+计算机 3
保安+学生 8
教育+大学 12怎么样处理成
key count
大学+教育 17
计算机+书本 4
大学生+吃饭 3
保安+学生 8
也就是说计算 判断 key 的回文(比如 大学+教育 等同于 教育+大学 来统计后面的 count )
sql 语句应该怎么写?
万分感谢@
insert into @t select '大学+教育 ',5
insert into @t select '计算机+书本',1
insert into @t select '大学生+吃饭',3
insert into @t select '书本+计算机',3
insert into @t select '保安+学生 ',8
insert into @t select '教育+大学 ',12 select
key_a+'+'+key_b as [key],sum([count]) as [count]
from
(select rtrim(left([key],charindex('+',[key])-1)) key_a,rtrim(stuff([key],1,charindex('+',[key]),'')) key_b,[count] from @t
union all
select rtrim(stuff([key],1,charindex('+',[key]),'')) key_b,rtrim(left([key],charindex('+',[key])-1)) key_a,[count] from @t) t
where
key_a>=key_b
group by
key_a,key_b/*
key count
----------------- -----
学生+保安 8
大学生+吃饭 3
教育+大学 17
书本+计算机 4
*/
go
create table [tb1]([key] varchar(20),[count] int)
insert into [tb1] select '大学+教育 ',5
insert into [tb1] select '计算机+书本',1
insert into [tb1] select '大学生+吃饭',3
insert into [tb1] select '书本+计算机',3
insert into [tb1] select '保安+学生 ',8
insert into [tb1] select '教育+大学 ',12
if object_id('fn_ConvertKey') is not null drop function fn_ConvertKey
go
create function fn_ConvertKey
(
@key varchar(50)
)
returns varchar(50)
as
begin
declare @name1 varchar(50),@name2 varchar(50),@result varchar(50)
set @name1=rtrim(left(@key,charindex('+',@key)-1))
set @name2=rtrim(stuff(@key,1,charindex('+',@key),''))
if(@name1>@name2)
set @result=@name2+'+'+@name1
else
set @result=@name1+'+'+@name2
return @result
endselect dbo.fn_ConvertKey([key]) as [key],Sum([count]) as [count] from [tb1]
group by dbo.fn_ConvertKey([key])
key_a+'+'+key_b as [key],sum([count]) as [count]
from
(select rtrim(left([key],charindex('+',[key])-1)) key_a,rtrim(stuff([key],1,charindex('+',[key]),'')) key_b,[count] from @t
union all
select rtrim(stuff([key],1,charindex('+',[key]),'')) key_b,rtrim(left([key],charindex('+',[key])-1)) key_a,[count] from @t) t
where
key_a>=key_b
group by
key_a,key_b
insert into #1 select '大学+教育',5
insert into #1 select '计算机+书本',1
insert into #1 select '大学生+吃饭',3
insert into #1 select '书本+计算机',3
insert into #1 select '保安+学生',8
insert into #1 select '教育+大学',12 select
[key] = keya + keyb
,sum([count]) as [count]
from
(
select
keya = case when parsename(replace([key],'+','.'),2) > parsename(replace([key],'+','.'),1) then parsename(replace([key],'+','.'),2) else parsename(replace([key],'+','.'),1) end
,keyb = case when parsename(replace([key],'+','.'),2) < parsename(replace([key],'+','.'),1) then parsename(replace([key],'+','.'),2) else parsename(replace([key],'+','.'),1) end
,[count]
from #1
) t
group by keya + keyb
/*
key count
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------
大学生吃饭 3
教育大学 17
书本计算机 4
学生保安 8(4 row(s) affected)*/
insert into #t select '大学+教育 ',5
insert into #t select '计算机+书本',1
insert into #t select '大学生+吃饭',3
insert into #t select '书本+计算机',3
insert into #t select '保安+学生 ',8
insert into #t select '教育+大学 ',12
select key_a+'+'+key_b as [key],sum([count]) as [count]
from(select rtrim(left([key],charindex('+',[key])-1)) key_a,rtrim(substring([key],charindex('+',[key])+1,len([key]))) key_b,[count] from #t
union all
select rtrim(substring([key],charindex('+',[key])+1,len([key]))) key_a,rtrim(left([key],charindex('+',[key])-1)) key_b,[count] from #t)t
where key_a<key_b
group by key_a,key_bdrop table #t
/*
吃饭+大学生 3
大学+教育 17
计算机+书本 4
保安+学生 8
*/