-------------------恶劣的行转列------------------------

being21 2006-12-04 10:59:04
--table1 --任务编码 --任务编码主键
--table2 --任务编码,人员编码 --没有主键,每个任务有不同的人员参与,级别不同,数量不定
--table3 --人员编码,人员类型 ,姓名 --0,1,2,3,4四个类型

declare @t table1(任务编码 varchar(20),车辆编码 varchar(10))
insert into @t select '001','001'
union all select '002','002'


declare @t table2(任务编码 varchar(20),人员编码 varchar(10))
insert into @t select '001','00001'
union all select '001','00003'
union all select '001','00005'
union all select '001','00007'
union all select '001','00009'
union all select '001','00010'
union all select '002','00002'
union all select '002','00004'
union all select '002','00006'
union all select '002','00008'
union all select '002','00010'
union all select '002','00001'
union all select '002','00003'

declare @t table3(人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into @t select '00001',0,'TTT'
union all select '00002',0,'YYY'
union all select '00003',1,'YYY'
union all select '00004',1,'YYY'
union all select '00005',2,'AAA'
union all select '00006',3,'CCC'
union all select '00007',4,'XXX'
union all select '00008',2,'SSS'
union all select '00009',3,'SSS'
union all select '00010',4,'SSS'
union all select '00011',2,'SSS'

select
任务编码,车辆编码,
类型0,--所有0类型人名相加,用/分割
类型1,--所有1类型人名相加,用/分割
类型2,--所有2类型人名相加,用/分割
类型3--所有3类型人名相加,用/分割

求高人帮助。
...全文
442 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjksoft 2006-12-04
  • 打赏
  • 举报
回复
学习
zjcxc 元老 2006-12-04
  • 打赏
  • 举报
回复
--table1 --任务编码 --任务编码主键
--table2 --任务编码,人员编码 --没有主键,每个任务有不同的人员参与,级别不同,数量不定
--table3 --人员编码,人员类型 ,姓名 --0,1,2,3,4四个类型

declare @t1 table(任务编码 varchar(20),车辆编码 varchar(10))
insert into @t1 select '001','001'
union all select '002','002'


declare @t2 table(任务编码 varchar(20),人员编码 varchar(10))
insert into @t2 select '001','00001'
union all select '001','00003'
union all select '001','00005'
union all select '001','00007'
union all select '001','00009'
union all select '001','00010'
union all select '002','00002'
union all select '002','00004'
union all select '002','00006'
union all select '002','00008'
union all select '002','00010'
union all select '002','00001'
union all select '002','00003'

declare @t3 table(人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into @t3 select '00001',0,'TTT'
union all select '00002',0,'YYY'
union all select '00003',1,'YYY'
union all select '00004',1,'YYY'
union all select '00005',2,'AAA'
union all select '00006',3,'CCC'
union all select '00007',4,'XXX'
union all select '00008',2,'SSS'
union all select '00009',3,'SSS'
union all select '00010',4,'SSS'
union all select '00011',2,'SSS'


;WITH
TM AS(
SELECT DISTINCT
A.任务编码, A.车辆编码,
C.人员类型, C.姓名
FROM @t1 A, @t2 B, @t3 C
WHERE A.任务编码 = B.任务编码
AND B.人员编码 = C.人员编码
),
TP AS(
SELECT
A.*,
姓名 = STUFF(B.re.value('(/r)[1]', 'nvarchar(max)'), 1, 1, N'')
FROM(
SELECT DISTINCT
任务编码, 车辆编码, 人员类型
FROM TM
)A
OUTER APPLY(
SELECT re = (
SELECT v = 姓名 FROM TM r
WHERE 任务编码 = A.任务编码
AND 车辆编码 = A.车辆编码
AND 人员类型 = A.人员类型
FOR XML AUTO, TYPE
).query('<r>{
for $i in /C/@v return(concat("/", string($i)))
}</r>')
)B
)
SELECT
任务编码, 车辆编码,
[类型0] = [0],
[类型1] = [1],
[类型2] = [2],
[类型3] = [3],
[类型4] = [4]
FROM TP
PIVOT(
MAX(姓名)
FOR 人员类型 IN([0], [1], [2], [3], [4])
)P

-- 结果
任务编码 车辆编码 类型0 类型1 类型2 类型3 类型4
001 001 TTT YYY AAA SSS SSS /XXX
002 002 TTT /YYY YYY SSS CCC SSS
being21 2006-12-04
  • 打赏
  • 举报
回复
呵呵,今天下午要做其他的事情了,先给分吧。我觉得差不多了。如果有细节不明白再问了。呵呵!

十分感谢
彩霞和老鳥龜
marco08 2006-12-04
  • 打赏
  • 举报
回复
彩霞和老鳥龜一唱一和的,讓人羡慕
dawugui 2006-12-04
  • 打赏
  • 举报
回复
任务编码 车辆编码 类型0 类型1 类型2 类型3 类型4
-------- -------- --------- ---------- ----- ----- -------
001 001 TTT YYY AAA SSS XXX/SSS
002 002 YYY/TTT YYY/YYY SSS CCC SSS
dawugui 2006-12-04
  • 打赏
  • 举报
回复
create table t1(任务编码 varchar(20),车辆编码 varchar(10))
insert into t1 select '001','001'
union all select '002','002'


create table t2(任务编码 varchar(20),人员编码 varchar(10))
insert into t2 select '001','00001'
union all select '001','00003'
union all select '001','00005'
union all select '001','00007'
union all select '001','00009'
union all select '001','00010'
union all select '002','00002'
union all select '002','00004'
union all select '002','00006'
union all select '002','00008'
union all select '002','00010'
union all select '002','00001'
union all select '002','00003'

create table t3 (人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into t3 select '00001',0,'TTT'
union all select '00002',0,'YYY'
union all select '00003',1,'YYY'
union all select '00004',1,'YYY'
union all select '00005',2,'AAA'
union all select '00006',3,'CCC'
union all select '00007',4,'XXX'
union all select '00008',2,'SSS'
union all select '00009',3,'SSS'
union all select '00010',4,'SSS'
union all select '00011',2,'SSS'

select t2.任务编码,t2.人员编码,t3.人员类型,t3.姓名
into t4
from t2,t3
where t2.人员编码 = t3.人员编码
go

if object_id('pubs..f_hb') is not null
drop function f_hb
go
--创建一个合并的函数
create function f_hb(@任务编码 as varchar(10) , @人员类型 int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + '/' + cast(姓名 as varchar) from t4 where 任务编码 = @任务编码 and 人员类型 = @人员类型
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select t5.任务编码,t1.车辆编码,t5.人员类型,t5.姓名组合
into t6
from
(select distinct 任务编码,人员类型 ,dbo.f_hb(任务编码,人员类型) as 姓名组合 from t4) t5,t1
where t1.任务编码 = t5.任务编码

declare @sql varchar(8000)
set @sql = 'select 任务编码,车辆编码'
select @sql = @sql + ' , max(case cast(人员类型 as varchar) when ''' + cast(人员类型 as varchar) + ''' then 姓名组合 end) [' + '类型' + cast(人员类型 as varchar) + ']'
from (select distinct 人员类型 from t6) as a
set @sql = @sql + ' from t6 group by 任务编码,车辆编码'
exec(@sql)

drop table t1,t2,t3,t4,t6

being21 2006-12-04
  • 打赏
  • 举报
回复
呵呵,是这样的,不过最头疼的还是合并这个问题。
dawugui 2006-12-04
  • 打赏
  • 举报
回复
要行列转换?
dawugui 2006-12-04
  • 打赏
  • 举报
回复
create table t1(任务编码 varchar(20),车辆编码 varchar(10))
insert into t1 select '001','001'
union all select '002','002'


create table t2(任务编码 varchar(20),人员编码 varchar(10))
insert into t2 select '001','00001'
union all select '001','00003'
union all select '001','00005'
union all select '001','00007'
union all select '001','00009'
union all select '001','00010'
union all select '002','00002'
union all select '002','00004'
union all select '002','00006'
union all select '002','00008'
union all select '002','00010'
union all select '002','00001'
union all select '002','00003'

create table t3 (人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into t3 select '00001',0,'TTT'
union all select '00002',0,'YYY'
union all select '00003',1,'YYY'
union all select '00004',1,'YYY'
union all select '00005',2,'AAA'
union all select '00006',3,'CCC'
union all select '00007',4,'XXX'
union all select '00008',2,'SSS'
union all select '00009',3,'SSS'
union all select '00010',4,'SSS'
union all select '00011',2,'SSS'

select t2.任务编码,t2.人员编码,t3.人员类型,t3.姓名
into t4
from t2,t3
where t2.人员编码 = t3.人员编码
go

if object_id('pubs..f_hb') is not null
drop function f_hb
go
--创建一个合并的函数
create function f_hb(@任务编码 as varchar(10) , @人员类型 int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + '/' + cast(姓名 as varchar) from t4 where 任务编码 = @任务编码 and 人员类型 = @人员类型
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select t5.任务编码,t1.车辆编码,t5.人员类型,t5.姓名组合
from
(select distinct 任务编码,人员类型 ,dbo.f_hb(任务编码,人员类型) as 姓名组合 from t4) t5,t1
where t1.任务编码 = t5.任务编码

任务编码 车辆编码 人员类型 姓名组合
-------------------- ---------- -------- --------
001 001 0 TTT
001 001 1 YYY
001 001 2 AAA
001 001 3 SSS
001 001 4 XXX/SSS
002 002 0 YYY/TTT
002 002 1 YYY/YYY
002 002 2 SSS
002 002 3 CCC
002 002 4 SSS

(所影响的行数为 10 行)
being21 2006-12-04
  • 打赏
  • 举报
回复

任务编码,车辆编码,类型0, 类型1, 类型2, 类型3
001 001 TTT/YYY YYY/YYY AAA XXX/SSS
002 002 TTT DDD ZZZ SSS

类似的 ,呵呵,随便写的。谢谢!!!
dawugui 2006-12-04
  • 打赏
  • 举报
回复
create table t3 (人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into t3 select '00001',0,'TTT'
union all select '00002',0,'YYY'
union all select '00003',1,'YYY'
union all select '00004',1,'YYY'
union all select '00005',2,'AAA'
union all select '00006',3,'CCC'
union all select '00007',4,'XXX'
union all select '00008',2,'SSS'
union all select '00009',3,'SSS'
union all select '00010',4,'SSS'
union all select '00011',2,'SSS'

select * from t1
select * from t2
select * from t3
go

if object_id('pubs..f_hb') is not null
drop function f_hb
go
--创建一个合并的函数
create function f_hb(@人员类型 int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + '/' + cast(姓名 as varchar) from t3 where 人员类型 = @人员类型
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct 人员类型 ,dbo.f_hb(人员类型) as 姓名组合 from t3


人员类型 姓名组合
-------- --------------
0 TTT/YYY
1 YYY/YYY
2 AAA/SSS/SSS
3 CCC/SSS
4 XXX/SSS

(所影响的行数为 5 行)
dawugui 2006-12-04
  • 打赏
  • 举报
回复
收点楼上的版权费.

另:请楼主给个具体的结果来.
caixia615 2006-12-04
  • 打赏
  • 举报
回复
--带符号合并行列转换

--有表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

--创建一个合并的函数
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
转dawugui的,LZ改下就行了

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧