怎么如此转换成横放?BomM_ID BomD2_D1LineID BomD1_UsePart BomD2_MateColor
----------- -------------- -------------------------------- -----------------------------------------------------
1 1 大身 红色
1 1 大身 红色
1 1 大身 红色
1 1 大身 红色
1 1 大身 ww色
1 1 大身 红色
1 1 大身 红色
1 2 领 yellow
1 2 领 white
1 2 领 blue
1 2 领 black
1 2 领 ww色
1 2 领 粉色
1 2 领 红色(所影响的行数为 14 行)
BomM_ID BomD2_D1LineID BomD1_UsePart
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色
----------- -------------- -------------------------------- -----------------------------------------------------
1 1 大身 红色
1 1 大身 红色
1 1 大身 红色
1 1 大身 红色
1 1 大身 ww色
1 1 大身 红色
1 1 大身 红色
1 2 领 yellow
1 2 领 white
1 2 领 blue
1 2 领 black
1 2 领 ww色
1 2 领 粉色
1 2 领 红色(所影响的行数为 14 行)
BomM_ID BomD2_D1LineID BomD1_UsePart
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色
普通行列转换
(爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/-------------------------------------------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
/*
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
/*
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74
*/-------------------------------------------------------------------
/*加个平均分,总分
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理,
cast(avg(result*1.0) as decimal(18,2)) 平均分,
sum(result) 总分
from tb
group by name
/*
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)
/*
姓名 数学 物理 语文 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 84 94 74 84.00 252
张三 83 93 74 83.33 250
*/drop table tb ---------------------------------------------------------
---------------------------------------------------------
/*
如果上述两表互相换一下:即姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94想变成
Name Subject Result
---------- ------- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
*/create table tb1
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
/*加个平均分,总分
Name Subject Result
---------- ------- --------------------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
*/select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
union all
select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
union all
select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', 'ww色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 2, '领' , 'yellow')
insert into tb values(1, 2, '领' , 'white')
insert into tb values(1, 2, '领' , 'blue')
insert into tb values(1, 2, '领' , 'black')
insert into tb values(1, 2, '领' , 'ww色')
insert into tb values(1, 2, '领' , '粉色')
insert into tb values(1, 2, '领' , '红色')
goselect * , id = identity(int,1,1) into tmp from tb--静态SQL,指最多7个.
select BomM_ID , BomD2_D1LineID , BomD1_UsePart ,
max(case px when 1 then BomD2_MateColor else '' end) 'BomD2_MateColor1',
max(case px when 2 then BomD2_MateColor else '' end) 'BomD2_MateColor2',
max(case px when 3 then BomD2_MateColor else '' end) 'BomD2_MateColor3',
max(case px when 4 then BomD2_MateColor else '' end) 'BomD2_MateColor4',
max(case px when 5 then BomD2_MateColor else '' end) 'BomD2_MateColor5',
max(case px when 6 then BomD2_MateColor else '' end) 'BomD2_MateColor6',
max(case px when 7 then BomD2_MateColor else '' end) 'BomD2_MateColor7'
from
(
select * , px = (select count(1) from tmp where BomM_ID = t.BomM_ID and BomD2_D1LineID = t.BomD2_D1LineID and BomD1_UsePart = t.BomD1_UsePart and id < t.id) + 1 from tmp t
) t
group by BomM_ID , BomD2_D1LineID , BomD1_UsePart
/*
BomM_ID BomD2_D1LineID BomD1_UsePart BomD2_MateColor1 BomD2_MateColor2 BomD2_MateColor3 BomD2_MateColor4 BomD2_MateColor5 BomD2_MateColor6 BomD2_MateColor7
----------- -------------- ------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ----------------
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色(所影响的行数为 2 行)
*/drop table tb,tmp
呵呵,忘了,在@sql 中还要增加修改临时表的语句,即增加对应的列。
create table tb (bid int,bname varchar(10),mpid int,mpname varchar(10),con int,bcon int)
insert into tb select 10,'董事会',1,'FB01A',60,5
insert into tb select 10,'董事会',2,'FB01B',60,0
insert into tb select 10,'董事会',3,'FB01C',60,0
insert into tb select 10,'董事会',4,'FB02A',60,8
insert into tb select 10,'董事会',5,'FB02B',60,0
insert into tb select 10,'董事会',6,'FB02C',60,2
insert into tb select 19,'营业',1,'FB01A',60,0
insert into tb select 19,'营业',2,'FB01B',60,0
insert into tb select 19,'营业',3,'FB01C',60,0
insert into tb select 19,'营业',4,'FB02A',60,0
insert into tb select 19,'营业',5,'FB02B',60,0
insert into tb select 19,'营业',6,'FB02C',60,0
declare @sql varchar(8000)
create table #tt(mpid int,mpname varchar(1000),con int)
set @sql = 'alter table #tt add '
select @sql=@sql+bname+' int, ' from tb group by bname
set @sql = left(@sql,len(@sql)-1)
exec(@sql)
set @sql = 'insert #tt select mpid,mpname,con'
select @sql = @sql + ' , max(case bname when ''' + bname + ''' then bcon else 0 end) [' + bname + '分配数]'
from (select distinct bname from tb ) as m
set @sql = @sql + ' from tb group by mpid,mpname,con'
select @sql
exec(@sql)
select * from #tt
drop table #tt
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', 'ww色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 2, '领' , 'yellow')
insert into tb values(1, 2, '领' , 'white')
insert into tb values(1, 2, '领' , 'blue')
insert into tb values(1, 2, '领' , 'black')
insert into tb values(1, 2, '领' , 'ww色')
insert into tb values(1, 2, '领' , '粉色')
insert into tb values(1, 2, '领' , '红色')
goselect * , id = identity(int,1,1) into tmp from tb--静态SQL,指最多7个.
select BomM_ID , BomD2_D1LineID , BomD1_UsePart ,
max(case px when 1 then BomD2_MateColor else '' end) 'BomD2_MateColor1',
max(case px when 2 then BomD2_MateColor else '' end) 'BomD2_MateColor2',
max(case px when 3 then BomD2_MateColor else '' end) 'BomD2_MateColor3',
max(case px when 4 then BomD2_MateColor else '' end) 'BomD2_MateColor4',
max(case px when 5 then BomD2_MateColor else '' end) 'BomD2_MateColor5',
max(case px when 6 then BomD2_MateColor else '' end) 'BomD2_MateColor6',
max(case px when 7 then BomD2_MateColor else '' end) 'BomD2_MateColor7'
from
(
select * , px = (select count(1) from tmp where BomM_ID = t.BomM_ID and BomD2_D1LineID = t.BomD2_D1LineID and BomD1_UsePart = t.BomD1_UsePart and id < t.id) + 1 from tmp t
) t
group by BomM_ID , BomD2_D1LineID , BomD1_UsePart
/*
BomM_ID BomD2_D1LineID BomD1_UsePart BomD2_MateColor1 BomD2_MateColor2 BomD2_MateColor3 BomD2_MateColor4 BomD2_MateColor5 BomD2_MateColor6 BomD2_MateColor7
----------- -------------- ------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ----------------
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色(所影响的行数为 2 行)
*/--动态SQL,指个数不确定
declare @sql1 varchar(8000)
set @sql1 = 'select BomM_ID , BomD2_D1LineID , BomD1_UsePart'
select @sql1 = @sql1 + ' , max(case px when ''' + cast(px as varchar) + ''' then BomD2_MateColor else '' '' end) [' + cast(px as varchar) + ']'
from (select distinct px from (select * , px = (select count(1) from tmp where BomM_ID = t.BomM_ID and BomD2_D1LineID = t.BomD2_D1LineID and BomD1_UsePart = t.BomD1_UsePart and id < t.id) + 1 from tmp t) m) as a
set @sql1 = @sql1 + ' from (select * , px = (select count(1) from tmp where BomM_ID = t.BomM_ID and BomD2_D1LineID = t.BomD2_D1LineID and BomD1_UsePart = t.BomD1_UsePart and id < t.id) + 1 from tmp t) m group by BomM_ID , BomD2_D1LineID , BomD1_UsePart'
exec(@sql1)
/*
BomM_ID BomD2_D1LineID BomD1_UsePart 1 2 3 4 5 6 7
----------- -------------- ------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色
*/drop table tb,tmp
insert into tb
select 1,1, '大身','红色' union all
select 1,1, '大身','红色' union all
select 1,1, '大身','红色' union all
select 1,1, '大身','红色' union all
select 1,1, '大身','ww色' union all
select 1,1, '大身','红色' union all
select 1,1, '大身','红色' union all
select 1,2, '领','yellow' union all
select 1,2, '领','white' union all
select 1,2, '领','blue' union all
select 1,2, '领','black' union all
select 1,2, '领','ww色' union all
select 1,2, '领','粉色' union all
select 1,2, '领','红色'
gocreate function f_getstr(@BomM_ID int,@BomD2_D1LineID int,@BomD1_UsePart varchar(20))
returns varchar(100)begin
declare @sql varchar(100)
set @sql=''
select @sql=@sql+','+BomD2_MateColor from tb
where BomM_ID=@BomM_ID and BomD2_D1LineID=@BomD2_D1LineID and BomD1_UsePart=@BomD1_UsePart
set @sql=stuff(@sql,1,1,'')
return (@sql)
endgoselect BomM_ID,BomD2_D1LineId,BomD1_UsePart,dbo.f_getstr(BomM_ID,BomD2_D1LineId,BomD1_UsePart) as BomD2_MateColor from tb
group by BomM_ID,BomD2_D1LineId,BomD1_UsePart
/*
BomM_ID BomD2_D1LineId BomD1_UsePart BomD2_MateColor
-----------------------------------------------------------------------------------------------
1 1 大身 红色,红色,红色,红色,ww色,红色,红色
1 2 领 yellow,white,blue,black,ww色,粉色,红色
*/
drop table tb
drop function f_getstr
create table tb(BomM_ID int, BomD2_D1LineID int, BomD1_UsePart varchar(10), BomD2_MateColor varchar(10))
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', 'ww色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 2, '领' , 'yellow')
insert into tb values(1, 2, '领' , 'white')
insert into tb values(1, 2, '领' , 'blue')
insert into tb values(1, 2, '领' , 'black')
insert into tb values(1, 2, '领' , 'ww色')
insert into tb values(1, 2, '领' , '粉色')
insert into tb values(1, 2, '领' , '红色')
go--创建一个合并的函数
create function f_hb(@BomM_ID int,@BomD2_D1LineID int , @BomD1_UsePart varchar(20))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ' ' + cast(BomD2_MateColor as varchar) from tb where BomM_ID = @BomM_ID and BomD2_D1LineID = @BomD2_D1LineID and BomD1_UsePart = @BomD1_UsePart
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct BomM_ID,BomD2_D1LineID,BomD1_UsePart ,dbo.f_hb(BomM_ID,BomD2_D1LineID,BomD1_UsePart) as BomD2_MateColor from tbdrop table tb
drop function f_hb/*
BomM_ID BomD2_D1LineID BomD1_UsePart BomD2_MateColor
----------- -------------- ------------- --------------------------------------
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色(所影响的行数为 2 行)
*/
create table tb(BomM_ID int, BomD2_D1LineID int, BomD1_UsePart varchar(10), BomD2_MateColor varchar(10))
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', 'ww色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 1, '大身', '红色')
insert into tb values(1, 2, '领' , 'yellow')
insert into tb values(1, 2, '领' , 'white')
insert into tb values(1, 2, '领' , 'blue')
insert into tb values(1, 2, '领' , 'black')
insert into tb values(1, 2, '领' , 'ww色')
insert into tb values(1, 2, '领' , '粉色')
insert into tb values(1, 2, '领' , '红色')
go
SELECT * FROM(SELECT DISTINCT BomM_ID,BomD2_D1LineID,BomD1_UsePart FROM tb)A OUTER APPLY(
SELECT [BomD2_MateColor]= STUFF(REPLACE(REPLACE(
(
SELECT BomD2_MateColor FROM tb N
WHERE BomM_ID = A.BomM_ID and BomD2_D1LineID = A.BomD2_D1LineID and BomD1_UsePart = A.BomD1_UsePart
FOR XML AUTO
), '<N BomD2_MateColor="', ' '), '"/>', ' '), 1, 1, '')
)N
drop table tb
/*
BomM_ID BomD2_D1LineID BomD1_UsePart BomD2_MateColor
----------- -------------- ------------- --------------------------------------
1 1 大身 红色 红色 红色 红色 ww色 红色 红色
1 2 领 yellow white blue black ww色 粉色 红色(所影响的行数为 2 行)
*/