在所有值我有这样一个表:总结每一行
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
...
什么是最快的,以弥补这整个总列?
在所有值我有这样一个表:总结每一行
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
...
什么是最快的,以弥补这整个总列?
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)
另一种方式
SELECT *,
(SELECT SUM(C)
FROM (VALUES(col1),
(col2),
(col3)) V(C)) AS [Total]
FROM YourTable
我相信这只适用于SQL Server 2008或更高版本。 –
Ingenius,没有看到这种问题的语法。是否有一个估计的子树成本比我的例子高10倍......两者都非常有效,但实际上是这样。 – Jamiec
@DanielRenshaw - 是的。 'VALUES'构造函数是2008+。 2005年可能会使用'UNION ALL'或'UNPIVOT'。 –
谢谢this.Is能够创建此表的物理列,并把结果从查询中为每个行? - – dublintech
@dublintech - 请参阅更新 – Jamiec