我有一个包含许多列的表,其中一些列的名称以“EQ”开头。对于单个行,我想总结以“EQ”开头的列中的所有值,而不是其他值。我知道我可以这样做:
select EQ_DOMESTIC + EQ_INTL + EQ_OTHER from myTable where id=1
但是,我有很多专栏,而且我想知道我是否可以系统地完成,而无需输入每列的名称。我是否必须从另一个查询中的系统表中获取列名?
跟进问题:某些值为空,这使得总和为NULL。有没有办法避免为总和写出ISNULL(列,0)?
答案 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;