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

诚求一SQL语句
昨天和前天都问了类似的问题,   可是自己没有描述清楚意思,   导致一些可行的SQL语句自己用不上,   所以今天再描述一下我的问题.


前提:   我的这个SQL语句是在触发器里面用到的.
假如有逻辑表Inserted和表T
逻辑表Inserted的结构为col   ,col1
T的结构为col   ,col2

将Inserted和T通过col列做一个连接,   分别取出Inserted逻辑表中的col1列,   T表中的col2列,
查询出下面的结果:
col1   col2
1         A
2         D
1         B
1         C
2         E

现在对这个查询的结果进行处理,   要得到如下结果:
col1   col2
1         A,B,C
2         D,E

请问SQL语句应该怎么写?     非常感谢.


------解决方案--------------------
用函数不可以吗?


生成测试数据
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1, '张三 '
insert into 表 select 1, '李四 '
insert into 表 select 1, '王五 '
insert into 表 select 2, '赵六 '
insert into 表 select 2, '邓七 '
insert into 表 select 2, '刘八 '
go

--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ' '
select @ret = @ret+ ', '+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1, ' ')
return @ret
end
go


--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go

--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/


--删除测试数据
drop function f_str
drop table 表
go

------解决方案--------------------
有時候換個思路解決也未嘗不可啊~~~
不知道LZ的最終需求是什麼?

------解决方案--------------------
如果没有用到逻辑表Inserted的话,当然可以用函数了, 现在用到了Inserted, 好像在函数里是不能引用Inserted表的.


/////////////
创建一个临时表总可以了 吧 把 insert 复制进去 再操作
------解决方案--------------------
--带符号合并行列转换

--有表t,其数据如下:
a b
1 1
1 2
1 3
2 1
2 2
3 1
--如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1

create table tb
(
a int,
b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
go

if object_id( 'pubs..f_hb ') is not null
drop function f_hb
go

--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ' '
select @str = @str + ', ' + cast(b as varchar) from tb where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tb

drop table tb

--结果
a b
----------- ------
1 1,2,3
2 1,2
3 1

(所影响的行数为 3 行)


多个前列的合并
数据的原始状态如下:
ID PR CON OP SC
001 p c 差 6
001 p c 好 2
001 p c 一般 4
002 w e 差 8
002 w e 好 7
002 w e 一般 1
===========================
用SQL语句实现,变成如下的数据
ID PR CON OPS