2012-05-24 109 views
0

在所有值我有这样一个表:总结每一行

col1 col2 col3 total 
3 5 6 
7 8 null 
... 

我想总列COL1,COL2,COL3的每个的总和。所以在的情况下,总应该是:

col1 col2 col3 total 
3 5 6 14 
7 8 null 15 
... 

什么是最快的,以弥补这整个总列?

回答

4
select col1, col2, col3, 
     isnull(col1,0) + isnull(col2,0) + isnull(col3,0) as total 
from tableName 

如果您希望该列实际构成表格的一部分,那么最好的方法是将其设置为计算列。这会阻止它与行的其余部分不同步,同时仍然允许您像选择语句中的任何其他列那样对待它。

CREATE TABLE语句,将做到这一点:

CREATE TABLE [dbo].[tableName](
    [col1] [int] NULL, 
    [col2] [int] NULL, 
    [col3] [int] NULL, 
    [total] AS ((isnull([col1],0)+isnull([col2],0))+isnull([col3],0)) 
) 

另外,在SSMS只是跳转到你表设计,选择total列,表达isnull([col1],0)+isnull([col2],0))+isnull([col3],0)粘贴到名为computed column specification > formula

最后箱,如果你真的只想回填表中的总列(不要!这是一个坏主意。你的数据稍后有人更新col1,2或3时不同步而忘记更新总数)只使用一个更新

UPDATE tableName 
SET total = isnull([col1],0)+isnull([col2],0))+isnull([col3],0) 
+0

谢谢this.Is能够创建此表的物理列,并把结果从查询中为每个行? - – dublintech

+0

@dublintech - 请参阅更新 – Jamiec

2

另一种方式

SELECT *, 
     (SELECT SUM(C) 
     FROM (VALUES(col1), 
         (col2), 
         (col3)) V(C)) AS [Total] 
FROM YourTable 
+0

我相信这只适用于SQL Server 2008或更高版本。 –

+0

Ingenius,没有看到这种问题的语法。是否有一个估计的子树成本比我的例子高10倍......两者都非常有效,但实际上是这样。 – Jamiec

+0

@DanielRenshaw - 是的。 'VALUES'构造函数是2008+。 2005年可能会使用'UNION ALL'或'UNPIVOT'。 –