行列转换问题
表一
部门名 年周 发注数 比率
001 20 1 10%
001 30 4 10%
001 40 5 10%
002 20 1 20%
002 40 1 20%
转化成表B
部门名 区分 20 30 40 统计
001 发注数 1 4 5 10
比率 10% 10% 10% 10%
002 发注数 1 0 1 2
比率 20% - 20% 20%
统计 发注数 2 4 6 12
比率 20% 10% 20% 20%
最下面统计的比率和右边的比率,取最大值,
要动态的
谢谢啦
[解决办法]
--上面的有点小bug,试试下面的
create table 表1(部门名 varchar(10),年周 varchar(10),发注数 int,比率 varchar(10))
insert 表1
select '001 ', '20 ',1, '10% '
union select '001 ', '30 ',4, '10% '
union select '001 ', '40 ',5, '10% '
union select '002 ', '20 ',1, '20% '
union select '002 ', '40 ',1, '20% '
--------------------
declare @sql varchar(8000),@sql1 varchar(8000),@sql_qf varchar(8000),@sql_bl varchar(8000)
select @sql= 'select 部门名, ' '发注数 ' ' as 区分 ',
@sql1= ',cast(sum(发注数) as varchar) as 统计 from 表1 group by 部门名 union all select 部门名, ' '比率 ' ' as 区分 ',
@sql_qf= 'select ' '统计 ' ' 部门名, ' '发注数 ' ' ',
@sql_bl= 'select ' ' ' ' 部门名 , ' '比率 ' ' '
---
select @sql_qf=@sql_qf+ ',cast(sum([ '+cast(年周 as varchar)+ ']) as varchar) [ '+cast(年周 as varchar)+ '] ',
@sql_bl= @sql_bl+ ',cast(isnull(max(left([ '+cast(年周 as varchar)+ '],len([ '+cast(年周 as varchar)+ '])-1)), ' '- ' ') as varchar) [ '+cast(年周 as varchar)+ '] '
from 表1 group by 年周
--
select @sql_qf=@sql_qf+ ',cast(sum(统计) as varchar) 统计 from (select ' 'a ' ' c ',
@sql_bl=@sql_bl+ ',max(统计) 统计 from (select ' 'a ' ' c '
---
select @sql=@sql+ ',cast(sum(case 年周 when '+cast(年周 as varchar)+ ' then 发注数 else 0 end) as varchar) [ '+cast(年周 as varchar)+ '] ',
@sql1=@sql1+ ',cast(isnull(max(case 年周 when '+cast(年周 as varchar)+ ' then 比率 end), ' '- ' ') as varchar) [ '+cast(年周 as varchar)+ '] ',
@sql_qf=@sql_qf+ ',sum(case 年周 when '+cast(年周 as varchar)+ ' then 发注数 else 0 end) [ '+cast(年周 as varchar)+ '] ',
@sql_bl= @sql_bl+ ',isnull(max(case 年周 when '+cast(年周 as varchar)+ ' then 比率 end), ' '- ' ') [ '+cast(年周 as varchar)+ '] '
from 表1 group by 年周
exec(@sql+@sql1+ ',max(比率) as 统计 from 表1 group by 部门名 '+ ' union all '+@sql_qf+ ',sum(发注数) as 统计 from 表1 group by 部门名 ) t group by t.c '+ ' union all '+@sql_bl+ ',max(比率) as 统计 from 表1 group by 部门名 ) t group by t.c ')
drop table 表1