首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

行列转换有关问题

2012-02-15 
行列转换问题表一部门名年周发注数比率00120110%00130410%00140510%00220120%00240120%转化成表B部门名区

行列转换问题
表一

部门名     年周           发注数     比率
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

热点排行