--今天交接结束,得益于大富翁很多很多,平时没时间过来,今天来给大家解决问题,涉及SQL SERVER DELPHI7/2006 CXGRID/DXGRID Reportbuild
--以下是写死与不写死的两种方法,如有问题请联系grj163my@163.net
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Proc_DecussateTable]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Proc_DecussateTable]
go
CREATE PROCEDURE [dbo].[Proc_DecussateTable]
(
@TableName varchar(100),
@RowFieldName varchar(100),
@ColFieldName varchar(100),
@ValueFieldName varchar(100)
)
AS
set nocount on
declare @sql Nvarchar(4000)
declare @Returnsql Nvarchar(4000)
set @sql = ' set @Returnsql ='' select '+@RowFieldName+','' '+
' select @Returnsql = @Returnsql+'' sum(case '+@ColFieldName+' when'''''' +'+@ColFieldName+'+ '''''' then '+@ValueFieldName+' else 0 end) as ''''''+ '+@ColFieldName+'+'''''','''+
' from (select distinct '+@ColFieldName+' from '+@TableName+') as a '
--得到结果的表语句(核心部分)
exec sp_executesql @Sql,N'@Returnsql Nvarchar(4000) output',@Returnsql output
set @sql = left(@Returnsql,len(@Returnsql)-1) +
',(select sum('+@ValueFieldName+') from '+@TableName+' a where a.'+@RowFieldName+'=b.'+@RowFieldName+') as 总计 '+
' from '+@TableName+' b group by '+@RowFieldName+''
--执行语句
exec sp_executesql @Sql
go
CREATE TABLE [Test] (
[bm] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[km] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[zgxe] [numeric](18, 0) NULL
) ON [PRIMARY]
GO
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门一',N'出差费',200)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门一',N'补助',300)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门二',N'出差费',100)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门二',N'补助',200)
exec Proc_DecussateTable 'test','bm','km','zgxe'
--请在查询分析器中运行上面的语句,这是动态的方法,静态的如下
select bm, sum(case km when'补助' then zgxe else 0 end) as '补助',
sum(case km when'出差费' then zgxe else 0 end) as '出差费',
(select sum(zgxe) from test a where a.bm=b.bm) as 总计
from test b group by bm
drop table test