2012-07-02 61 views
0

我有一个包含许多列的表,其中一些名称以“EQ”开头。对于单个行,我想总结列中以“EQ”开头的所有值,但不包括其他值。我知道我能做到这一点是这样的:通过名称跨列的SQL总和

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

不过,我有很多栏目,而且,我在想​​,如果我能有系统地做到这一点无需在每个列的名称输入。我需要从另一个查询中的系统表中获取列名吗?

后续问题:其中一些值为空值,它们的和为NULL。有没有办法避免写出ISNULL(列,0)的总和?

+0

想不出一个的,你需要写出来ISNULL(列名,0),每列不只是为contatentated总和。 – HLGEM

回答

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;