首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教一条SQL,不是很难,但可以帮忙写出一条高效点吗?有详细说明

2012-01-08 
请问一条SQL,不是很难,但可以帮忙写出一条高效点吗?有详细说明1、首先将这个记录的公司名称字段与下面所有

请问一条SQL,不是很难,但可以帮忙写出一条高效点吗?有详细说明
1、首先将这个记录的公司名称字段与下面所有记录逐一比较,看公司名称字段是否一样;
2、如果不一样,走到下一记录继续比较;
3、如果公司名称一样,再比较其它各字段;
4、如果这个字段的值包含下面的记录该字段的值,则保留该字段的值不变;
如果这个字段的值不包含下面的记录该字段的值,则将该字段的值更改为该字段的值+‘&++&’+下面记录该字段的值;
5、比较完所有字段后,删除相同公司名称的比较的下面的这条记录,因为他的信息已经合并进入了上面的记录;
6、把第一条记录与所有下面的记录比较完成后,再对第二条记录与后面所有的记录做上面同样的比较、调整;直到所有记录结束。

举例说明:
原始数据库如下
CompanyLinkmanTelFaxMobile……
公司11P1+1P21T1
公司22P12T1
公司33P13T1
公司11P21T6
公司11P31T1
公司33P23T1
公司22P12T1

……

整理后数据库
CompanyLinkman                   Tel……
公司11P1+1P2&++&1P31T1&++&1T6
公司22P1                   2T1
公司33P1&++&3P23T1


……

合并过程说明:
包含的保留原值,如:公司1的联系人字段1P1+1P2与下面公司1的记录的1P2;公司2的联系人字段2P1、电话字段2T1;
不包含的就相加,如:公司1的联系人字段1P1+1P2&++&1P3;

----------
谢谢!


[解决办法]
create function fn_Linkman(
@Company varchar(30)
)
returns varchar(300)
as
begin
declare @r varchar(300)
set @r= ' '
select @r=@r+ '&++& '+isnull(Linkman, ' ') from 原始数据库 where Company=@Company group by Linkman
if @r <> ' '
set @r=stuff(@r,1,4, ' ')
return @r
end

go

create function fn_Tel(
@Company varchar(30)
)
returns varchar(300)
as
begin
declare @r varchar(300)
set @r= ' '
select @r=@r+ '&++& '+isnull(Tel, ' ') from 原始数据库 where Company=@Company group by Tel
if @r <> ' '
set @r=stuff(@r,1,4, ' ')
return @r
end

go
...

--调用
select Company,dbo.fn_Linkman(Company) as Linkman,dbo.fn_Tel(Company) as Tel
from 原始数据库
group by Company

[解决办法]
楼上的,楼主要求的是去掉包含的记录
而你的结果是
CompanyLinkman Tel
公司11P1+1P2&++&1P2&++&1P31T1&++&1T6
公司22P12T1
公司33P1&++&3P23T1

要求的结果
CompanyLinkman Tel
公司11P1+1P2&++&1P31T1&++&1T6
公司22P1 2T1
公司33P1&++&3P23T1
[解决办法]
/*
整理后数据库
CompanyLinkman Tel……
公司11P1+1P2&++&1P31T1&++&1T6
公司22P1 2T1
公司33P1&++&3P23T1
*/
declare @t1 table(company varchar(20),linkman varchar(20),tel varchar(20))
declare @tb table (company varchar(20),linkman varchar(4000),tel varchar(4000))
insert into @t1
select '公司1 ', '1P1+1P2 ', '1T1 ' union all
select '公司2 ', '2P1 ', '2T1 ' union all
select '公司3 ', '3P1 ', '3T1 ' union all
select '公司1 ', '1P2 ', '1T6 ' union all
select '公司1 ', '1P3 ', '1T1 ' union all
select '公司3 ', '3P2 ', '3T1 ' union all
select '公司2 ', '2P1 ', '2T1 '
--select * from @t1
declare @col1 varchar(20),@col2 varchar(20),@col3 varchar(20)
declare @ls1 varchar(20),@ls2 varchar(4000),@ls3 varchar(4000)
declare cur cursor for
select Company,Linkman,Tel from @t1 order by company
open cur
fetch next from cur into @col1,@col2,@col3


select @ls1=@col1,@ls2=@col2,@ls3=@col3
while @@fetch_status=0
begin
if @col1 <> @ls1
begin
insert into @tb values(@ls1,@ls2,@ls3)
select @ls1=@col1,@ls2=@col2,@ls3=@col3
end
else
select @ls2=@ls2+(case when charindex(@col2,@ls2)> 0 then ' ' else '&++& '+@col2 end),
@ls3=@ls3+(case when charindex(@col3,@ls3)> 0 then ' ' else '&++& '+@col3 end)

fetch next from cur into @col1,@col2,@col3
end
deallocate cur
insert into @tb values(@ls1,@ls2,@ls3)
select * from @tb



[解决办法]
可以只用一個函數實現,而且可以不使用游標。

--創建函數
Create Function F_TEST(@company Varchar(20), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ' '
If(@Flag = 0)
Select @S = @S + (Case When CharIndex(linkman, @S) > 0 Then ' ' Else '&++& ' + linkman End) From TEST Where company = @company
Else
Select @S = @S + (Case When CharIndex(tel, @S) > 0 Then ' ' Else '&++& ' + tel End) From TEST Where company = @company
Select @S = Stuff(@S, 1, 4, ' ')
Return @S
End
GO
--測試
Select
company,
dbo.F_TEST(company, 0) As linkman,
dbo.F_TEST(company, 1) As tel
From
TEST
Group By
company
GO
[解决办法]
--創建環境
Create Table TEST
(company Varchar(20),
linkman Varchar(20),
tel Varchar(20))
Insert Into TEST
Select '公司1 ', '1P1+1P2 ', '1T1 ' Union All
Select '公司2 ', '2P1 ', '2T1 ' Union All
Select '公司3 ', '3P1 ', '3T1 ' Union All
Select '公司1 ', '1P2 ', '1T6 ' Union All
Select '公司1 ', '1P3 ', '1T1 ' Union All
Select '公司3 ', '3P2 ', '3T1 ' Union All
Select '公司2 ', '2P1 ', '2T1 '
GO
--創建函數
Create Function F_TEST(@company Varchar(20), @Flag Bit)
Returns Varchar(8000)
As
Begin
Declare @S Varchar(8000)
Select @S = ' '
If(@Flag = 0)
Select @S = @S + (Case When CharIndex(linkman, @S) > 0 Then ' ' Else '&++& ' + linkman End) From TEST Where company = @company
Else
Select @S = @S + (Case When CharIndex(tel, @S) > 0 Then ' ' Else '&++& ' + tel End) From TEST Where company = @company
Select @S = Stuff(@S, 1, 4, ' ')
Return @S
End
GO
--測試
Select
company,
dbo.F_TEST(company, 0) As linkman,
dbo.F_TEST(company, 1) As tel
From
TEST
Group By
company
GO
--刪除測試環境
Drop Table TEST
Drop Function F_TEST
--結果
/*
companylinkmantel
公司11P1+1P2&++&1P31T1&++&1T6
公司22P12T1
公司33P1&++&3P23T1
*/
[解决办法]
看看这个
http://topic.csdn.net/t/20041129/14/3598139.html
关注

热点排行