不过下面是偶的一个输出交叉表的存储过程,比较通用
//******************************************************************
CREATE procedure CorssTab
@strTabName as varchar(50) = 'Employees', --此处放表名
@strCol as varchar(50) = 'City', --表头分组依据字段
@strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
@strNumber as varchar(50) = 'ReportsTo', --被统计的字段
@strSum as varchar(10) = 'Sum' --运算方式
AS
DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
begin
SET nocount ON
SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段
OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾
EXECUTE(@strsql) --执行
IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功
insert #infeeitem_alldept(inpidno)
values(20020000001)
--从单据明细表得到该单据的内容(使用指针)
create table #lx(feeprintitemname char(10),infeeprintmoney money,totalinmoney money,totalmoney money,lastmoney money)
insert #lx
exec proc_infee '20020000001'
set @N=0
DECLARE infee CURSOR FOR --声明
select infeeprintmoney from #lx
OPEN infee --打开
FETCH NEXT FROM infee
INTO @infeeprintmoney
WHILE (@@FETCH_STATUS <> -1)
BEGIN
set @N=@N+1
set @p='p'+convert(char,@N)
update #infeeitem_alldept
set @p=@infeeprintmoney
where inpidno='20020000001'
FETCH NEXT FROM infee
INTO @infeeprintmoney
END
CLOSE infee
DEALLOCATE infee
select * from #infeeitem_alldept
drop table #infeeitem_alldept
drop table #lx