日期:2014-05-18 浏览次数:20551 次
USE TEMPDB
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
COL1 INT
,COL2 FLOAT
,COL3 VARCHAR(10)
)
INSERT INTO TB
SELECT 1,2.2,'A' UNION ALL
SELECT 2,3.3,'B'
GO
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL=ISNULL(@SQL+'
 UNION ALL ','')+'SELECT '''+COL.NAME+''' AS [列名],SUM('+COL.NAME+') AS [总和],AVG('+COL.NAME+') AS [平均数] FROM TB '
FROM SYS.COLUMNS COL
INNER JOIN SYS.TYPES TYPES ON COL.SYSTEM_TYPE_ID=TYPES.SYSTEM_TYPE_ID
WHERE OBJECT_NAME(OBJECT_ID)='TB' AND  TYPES.NAME IN ('tinyint','SMALLINT','INT','BIGINT','REAL','MONEY','NUMERIC','FLOAT','DECIMAL')
EXEC (@SQL)
/*
列名    总和    平均数
COL1    3    1
COL2    5.5    2.75
*/
------解决方案--------------------
create table chu(id char(3),sname char(5),sno int,sage int)
insert into chu
select '001','lx',5,17 union all
select '002','su',6,18 union all
select '003','wg',8,20 union all
select '004','hj',9,21
select * from chu
id   sname sno         sage
---- ----- ----------- -----------
001  lx    5           17
002  su    6           18
003  wg    8           20
004  hj    9           21
declare @sql varchar(6000)=''
select @sql=@sql
+' union all select '''+b.name+''' ''列名'',sum('+b.name+') ''总和'',avg('+b.name+') ''平均数'' from chu' 
from sys.objects a
inner join sys.columns b
on a.object_id=b.object_id
inner join sys.types c
on b.system_type_id=c.system_type_id
where a.[type]='U' and a.name='chu'
and c.name in ('int','decimal')
select @sql=stuff(@sql,1,11,'')
exec(@sql)
列名    总和        平均数
---- ----------- -----------
sno    28          7
sage   76          19
(2 row(s) affected)