当前位置: 代码迷 >> Sql Server >> 请教一条SQL,不是很难,但可以帮忙写出一条高效点吗?有详细说明
  详细解决方案

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

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

举例说明:
原始数据库如下
Company Linkman Tel Fax Mobile ……
公司1 1P1+1P2 1T1
公司2 2P1 2T1
公司3 3P1 3T1
公司1 1P2 1T6
公司1 1P3 1T1
公司3 3P2 3T1
公司2 2P1 2T1

……

整理后数据库
Company Linkman                   Tel ……
公司1 1P1+1P2&++&1P3 1T1&++&1T6
公司2 2P1                   2T1
公司3 3P1&++&3P2 3T1


……

合并过程说明:
包含的保留原值,如:公司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 @[email protected]+ '&++& '+isnull(Linkman, ' ') from 原始数据库 where [email protected] 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 @[email protected]+ '&++& '+isnull(Tel, ' ') from 原始数据库 where [email protected] 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

------解决方案--------------------
楼上的,楼主要求的是去掉包含的记录
而你的结果是
Company Linkman Tel
公司1 1P1+1P2&++&1P2&++&1P3 1T1&++&1T6
公司2 2P1 2T1
公司3 3P1&++&3P2 3T1

要求的结果
Company Linkman Tel
公司1 1P1+1P2&++&1P3 1T1&++&1T6
公司2 2P1 2T1
公司3 3P1&++&3P2 3T1
------解决方案--------------------
/*
整理后数据库
Company Linkman Tel ……
公司1 1P1+1P2&++&1P3 1T1&++&1T6
公司2 2P1 2T1
公司3 3P1&++&3P2 3T1
*/
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
  相关解决方案