高手帮助,记录合并的问题
- SQL code
CCCIL-云南-市场执行 保山营业所 何双艳 1007095 CL21155 CL21155 CL21155 KM79000 YN01007095 KM79000 101549 Shuang Yan He/YN/CCCIL@CCCILCCCIL-云南-市场执行 保山营业所 何双艳 1007095 CL21155 CL21155 CL21155 KM79000 YN101549 KM79000 101549 Shuang Yan He/YN/CCCIL@CCCILCCCIL-云南-绩效财务 财务会计 王乙冰 1007102 CL21177 CL21177 KM65017 101565 Vivian Wang/YN/CCCIL@CCCILCCCIL-云南-绩效财务 财务会计 王乙冰 1007102 CL25196 KM65017 101565 Vivian Wang/YN/CCCIL@CCCILCCCIL-云南-绩效财务 信息技术 吕坤 1007311 CL21199 CL21199 CL21199 KM79265 KM63718 KM63718 KM63718 101874 Kun Lv/YN/CCCIL@CCCILCCCIL-云南-绩效财务 信息技术 吕坤 1007311 CL21199 CL21199 CL21199 KM79265 KM73211 KM63718 KM63718 101874 Kun Lv/YN/CCCIL@CCCILCCCIL-云南-绩效财务 信息技术 吕坤 1007311 CL21199 CL21199 CL21199 KM79265 KM79265 KM63718 KM63718 101874 Kun Lv/YN/CCCIL@CCCILCCCIL-云南-市场执行 销售资产管理 白若熙 1024611 CL22315 CL22315 KM85299 1024611 Ruo Xi Bai/YN/CCCIL@CCCILCCCIL-云南-市场执行 销售资产管理 白若熙 1024611 CL22315 CL22315 KM85299 1024611 Ruo Xi Bai/YN/CCCIL@CCCIL
记录为以上的这种形式,每个用户在后面的字段中有2或者3个用户,现在我是左外联接到主表上的,会有多条记录,如何让多记录的用户合并成一条记录,如果在其他字段上有多个值,让它们在合并以空格分开.
[解决办法]
用这种形式,楼主照着写
select col1,col2,
col3=(select ' '+col3 from tb where col1=t.col1 and col2=t.col2 for xml path(''))
from tb t
group by col1,col2
[解决办法]
- SQL code
if exists(select * From sysobjects where name = 'vw_test' and xtype = 'V') drop view vw_testGocreate view vw_Testasselect 'CCCIL-云南-市场执行' 资能部门, '保山营业所' 组织结构, '何双艳' 员工姓名 , '1007095' PCB100BI用户, 'CL21155' PCH100用户, 'CL21155' PCR200用户, 'CL21155' CTS用户 union allselect 'CCCIL-云南-市场执行', '保山营业所', '何双艳', 'KM79000', 'YN101549', 'CL21155', 'CL21155' union allselect 'CCCIL-云南-绩效财务', '财务会计', '王乙冰', '1007102', 'CL21177', 'CL21177', 'KM65017' union allselect 'CCCIL-云南-绩效财务', '财务会计', '王乙冰', '1007102', 'CL25196', 'KM65017', '101565' union allselect 'CCCIL-云南-绩效财务', '信息技术', '吕坤', '1007311', 'CL21199', 'CL21199', 'CL21199' union allselect 'CCCIL-云南-绩效财务', '信息技术', '吕坤', '1007311', 'CL21199', 'KM79265', 'CL21199' union allselect 'CCCIL-云南-绩效财务', '信息技术', '吕坤', '1007311', 'CL21199', 'KM63718', 'CL21199' union allselect 'CCCIL-云南-市场执行', '销售资产管理', '白若熙', '1024611', 'CL22315', 'CL22315', 'KM85299' union allselect 'CCCIL-云南-市场执行', '销售资产管理', '白若熙', '1024611', 'CL22315', 'CL22315', '1024611' Goif exists(select * from sysobjects where name = 'fn_MergeStr' and xtype = 'fn') drop function fn_MergeStrGocreate function fn_MergeStr(@name varchar(100), @Index integer)returns varchar(8000)asbegin--@index : 用来判断取那个字段,例如 1 代表 PCB100BI用户, 2代表 PCH100用户, 3代表PCR200用户等等 DECLARE @r varchar(8000) SET @r='' select @r = case @index when 1 then case when PCB100BI用户 <> left(@r, LEN(PCB100BI用户)) then @r + PCB100BI用户 + ' ' else @r end when 2 then case when PCH100用户 <> left(@r, LEN(PCH100用户)) then @r + PCH100用户 + ' ' else @r end when 3 then case when PCR200用户 <> left(@r, LEN(PCR200用户)) then @r + PCR200用户 + ' ' else @r end else '' end from vw_test where 员工姓名 = @name return @rendGOselect a.员工姓名, dbo.fn_MergeStr(员工姓名, 1) PCB100BI用户, dbo.fn_MergeStr(员工姓名, 2) PCH100用户, dbo.fn_MergeStr(员工姓名, 3) PCR200用户from (select distinct 员工姓名 from vw_test) a
[解决办法]
- SQL code
/*标题:按某字段合并字符串之一(简单合并)作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:2008-11-06地点:广东深圳描述:将如下形式的数据按id字段合并value字段。id value----- ------1 aa1 bb2 aaa2 bbb2 ccc需要得到结果:id value------ -----------1 aa,bb2 aaa,bbb,ccc即:group by id, 求 value 的和(字符串相加)*/--1、sql2000中只能用自定义的函数解决create table tb(id int, value varchar(10))insert into tb values(1, 'aa')insert into tb values(1, 'bb')insert into tb values(2, 'aaa')insert into tb values(2, 'bbb')insert into tb values(2, 'ccc')gocreate function dbo.f_str(@id varchar(10)) returns varchar(1000)asbegin declare @str varchar(1000) select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id return @strendgo--调用函数select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_strdrop table tb--2、sql2005中的方法create table tb(id int, value varchar(10))insert into tb values(1, 'aa')insert into tb values(1, 'bb')insert into tb values(2, 'aaa')insert into tb values(2, 'bbb')insert into tb values(2, 'ccc')goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')from tbgroup by iddrop table tb--3、使用游标合并数据create table tb(id int, value varchar(10))insert into tb values(1, 'aa')insert into tb values(1, 'bb')insert into tb values(2, 'aaa')insert into tb values(2, 'bbb')insert into tb values(2, 'ccc')godeclare @t table(id int,value varchar(100))--定义结果集表变量--定义游标并进行合并处理declare my_cursor cursor local forselect id , value from tbdeclare @id_old int , @id int , @value varchar(10) , @s varchar(100)open my_cursorfetch my_cursor into @id , @valueselect @id_old = @id , @s=''while @@FETCH_STATUS = 0begin if @id = @id_old select @s = @s + ',' + cast(@value as varchar) else begin insert @t values(@id_old , stuff(@s,1,1,'')) select @s = ',' + cast(@value as varchar) , @id_old = @id end fetch my_cursor into @id , @valueENDinsert @t values(@id_old , stuff(@s,1,1,''))close my_cursordeallocate my_cursorselect * from @tdrop table tb
[解决办法]
- SQL code
select a.员工姓名, dbo.fn_MergeStr(员工姓名, 1) PCB100BI用户, dbo.fn_MergeStr(员工姓名, 2) PCH100用户, dbo.fn_MergeStr(员工姓名, 3) PCR200用户from (select distinct 员工姓名 from vw_test) a