2016-09-19 91 views
5

我有一张N列的表格。总计多列

我想有每个单独列的总和:

SELECT 
    id 
, SUM(X1) as X1 
, SUM(X2) as X2 
, SUM(X3) as X3 
............ 
FROM test 

但是我宁愿不要列出所有的列,因为我有太多的人。

是否有办法为SQL Server中的每一列创建总计?

+0

听起来像也许有很多列并不是最好的方法。每个值类型可以有一行(X1,X2,X3),然后通过'SELECT SUM(value)FROM测试GROUP BY类型'获取所需内容。 –

+0

不在标准SQL中 - 某些提供程序可能具有此语法但我没有知道。你可以编写代码或只是咬住子弹并将其输出 - 可能需要的时间少于编写问题和筛选答案的时间。 –

+0

简单地说,你不能这样做。你可以'使用动态sql,但它可以是复杂的 – TheGameiswar

回答

0

你要求这个

x1 x2 x3 
2 3 4 
2 3 4 

4 6  8 --result 

那就试试这个代码

SELECT 
    SUM(salary) as 'X1', 
    SUM(age) as 'X2', 
    SUM(mark) as 'X3' 
    FROM tsum 
1

您可以使用SQL Server做到这一点:

设置测试模式

create table p (id int, x1 int, x2 int, x3 int); 

insert into p values 
(1,1,0,1), 
(2,1,1,0), 
(3,1,0,1), 
(1,1,1,1); 

现在是SQL

declare @stmt as nvarchar(600); 

set @stmt =  
(
select concat('select id,', (
     SELECT LEFT(column_names , LEN(column_names)-1) AS column_names 
    FROM information_schema.columns AS extern 
    CROSS APPLY 
    (
    SELECT concat('sum(',column_name , ') as ', column_name,',') 
    FROM information_schema.columns AS intern 
    WHERE extern.table_name = intern.table_name and column_name <> 'ID' 
    FOR XML PATH('') 
    ) pre_trimmed (column_names) 
    where table_name = 'p' 
    GROUP BY table_name, column_names 
    ), 
    ' from p group by id') 
    ); 


execute sp_executesql @stmt; 

如果你添加了一百个其他列它应该工作。

你基本上建立一个SQL查询字符串,然后执行它。

这里的关键是我假设你有一个ID列,然后是所有Xn列。所以,如果你有另一个裁判专栏,说名字,你不想总结你会将你的Information_Schema查询更改为'和column_name not in ('id','name')

如果这也是Onerous,您可以添加一个where子句在内部选择仅对类型为Int的列进行求和。

Here is a working example