【问题标题】:SQL sum across columns by name按名称跨列的 SQL 求和
【发布时间】:2012-07-02 18:56:01
【问题描述】:

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

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

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

后续问题:有些值是空值,这使得总和为空。有什么办法可以避免在总和中写出 ISNULL(column,0)?

【问题讨论】:

  • 想不出一个,你需要为每一列写出 isnull(columnname, 0) 而不仅仅是包含的总和。

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


【解决方案1】:

您可以使用动态 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;

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 2011-04-15
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多