诚求一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