2012-05-24 116 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'。 –