对每列超过20列的值进行求和,而不写出每个总和

时间:2014-01-17 22:59:07

标签: sql sql-server

所以我需要在我正在使用的表格中得到20+列的总和,我真的不想写出每一列的总和,但我不确定是否可能。有没有办法让这个动态写入表中的所有列?

select isnull(osname, 'Total'), COUNT(*), SUM(col1), SUM(col2), SUM(col3)...sum(col27)
from usage
group by osname
with rollup

3 个答案:

答案 0 :(得分:3)

我会跑:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'usage'

然后我会将列复制到excel或google电子表格中。

然后在excel中创建B列:

="SUM(" & A1 & "),"

然后将其复制到所有适当的B细胞中。

答案 1 :(得分:1)

首先,如果你能自动化某些东西,请做。打出20,100列绝对是乏味的。

我的解决方案使用表变量函数来获取编号列的列表。这可以再次重复使用。

其次,我使用此函数创建一些动态T-SQL并应用您的逻辑。 WITH ROLLUP语法不符合ISO标准。它在2008 R2中被取代。

http://technet.microsoft.com/en-us/library/ms177673.aspx

让我们开展业务。我喜欢创建一个快速测试表,以确保我的语法是正确的。即使我犯了错误。

--
-- Setup test data
--

-- Just playing around
use tempdb;
go

-- Drop test table
if object_id ('usage') > 0 
drop table usage
go

-- Create test table
create table usage
( osname varchar(16),
  col1 int,
  col2 int,
  col3 int,
  col4 int,
  col5 int
);
go

-- Test data
insert into usage values
('UNIX', 1, 2, 3, 4, 5),
('UNIX', 2, 4, 6, 8, 10),
('WIN7', 1, 2, 3, 4, 5),
('WIN7', 2, 4, 6, 8, 10),
('WIN8', 5, 10, 15, 20, 25);
go

-- Show the data
select * from usage;
go

接下来,让我们创建一个内联表值函数。它们相对较快。

http://blog.waynesheffield.com/wayne/archive/2012/02/comparing-inline-and-multistatement-table-valued-functions/

--
-- Create helper function
--

-- Remove ITVF
if object_id('get_columns') > 0
drop function get_columns
go

-- Create ITVF
create function get_columns (@table_name sysname)
returns table
as
return 
(
  select top 100 column_id, name from sys.columns where object_id in
  (  select object_id from sys.tables t where t.name = @table_name )
  order by column_id
)
go

-- Get the columns
select * from get_columns('usage');
go

现在,让我们把它们放在一起来解决你的问题。请注意,您需要列出您遗漏的列名。我还改用了ISO兼容语法。

--
-- Solve the problem
--

-- Dynamic SQL
declare @var_tsql nvarchar(max) = 'SELECT ';
select 
  @var_tsql += 
    case 
      when column_id <> 1 then 'SUM(' + name + ') as s_' + name + ', ' 
      else 'ISNULL(' + name + ', ''Total'') as s_name, '
    end 
from get_columns('usage');
select @var_tsql += 'COUNT(*) as s_count FROM usage GROUP BY ROLLUP(osname); '

--print @var_tsql
EXEC sp_executesql @var_tsql;

print语句用于调试任何语法错误。剪切并粘贴到另一个窗口以检查语法。学的越多,动态SQL就越容易。

以上动态TSQL工作正常。这是你的输出。

enter image description here

答案 2 :(得分:0)

没有办法绕过它。

输入它们(不应该花费更多时间)。