按名称跨列的SQL总和

时间:2012-07-02 18:56:02

标签: sql sql-server sql-server-2008

我有一个包含许多列的表,其中一些列的名称以“EQ”开头。对于单个行,我想总结以“EQ”开头的列中的所有值,而不是其他值。我知道我可以这样做:

select EQ_DOMESTIC + EQ_INTL + EQ_OTHER from myTable where id=1

但是,我有很多专栏,而且我想知道我是否可以系统地完成,而无需输入每列的名称。我是否必须从另一个查询中的系统表中获取列名?

跟进问题:某些值为空,这使得总和为NULL。有没有办法避免为总和写出ISNULL(列,0)?

1 个答案:

答案 0 :(得分:4)

您可以使用动态SQL轻松完成此操作:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
   + COALESCE(' + QUOTENAME(name) + ', 0)'
FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name LIKE 'EQ[_]%';

SELECT @sql += N',' + QUOTENAME(name)
  FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name NOT LIKE 'EQ[_]%';

SELECT @sql = 'SELECT [EQ_SUM] = 0' + @sql
  + ' FROM dbo.MyTable WHERE id = 1;';

PRINT @sql;
-- EXEC sp_executesql @sql;