日期:2014-05-18  浏览次数:20688 次

哪位老兄能帮我用存储过程变横向表为纵向表?
哪位老兄能帮我用存储过程变横向表为纵向表?

例如:

A           B           C             D               E
-----------------------------
1           2           3             4               5
6           7           8             9               10
11         12         13           14             15
16         17         18           19             20
......

改为:

I           II         III         IV           ......
_____________________________
1           6           11           16  
2           7           12           17
3           8           13           18
4           9           14           19
5           10         15           20         ......

列名可以自定义!
多谢,拜托!

------解决方案--------------------
/*------一个标准的统计交叉表过程-----------*/

if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[p_qry] ') and OBJECTPROPERTY(id, N 'IsProcedure ') = 1)
drop procedure [dbo].[p_qry]
GO

/*--生成交叉表的简单通用存储过程

根据指定的表名,纵横字段,统计字段,自动生成交叉表
并可根据需要生成纵横两个方向的合计

注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段
如果不要此功能,则去掉交换处理部分

--邹建 2004.06--*/

/*--调用示例

exec p_qry 'syscolumns ', 'id ', 'colid ', 'colid ',1,1
--*/

create proc p_qry
@TableName sysname, --表名
@纵轴 sysname, --交叉表最左面的列
@横轴 sysname, --交叉表最上面的列
@表体内容 sysname, --交叉表的数数据字段
@是否加横向合计 bit,--为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar(4000),@sql varchar(8000)

--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
set @s= 'declare @a sysname
if(select case when count(distinct [ '+@纵轴+ ']) <count(distinct [ '+@横轴+ ']) then 1 else 0 end
from [ '+@TableName+ '])=1
select @a=@纵轴,@纵轴=@横轴,@横轴=@a '
exec sp_executesql @s
,N '@纵轴 sysname out,@横轴 sysname out '
,@纵轴 out,@横轴 out

--生成交叉表处理语句
set @s= '
set @s= ' ' ' '
select @s=@s+ ' ',[ ' '+cast([ '+@横轴+ '] as varchar)+ ' ']=sum(case [ '+@横轴
+ '] when ' ' ' ' ' '+cast([ '+@横轴+ '] as varchar)+ ' ' ' ' ' ' then [ '+@表体内容+ '] else