在计算列中使用求和函数

Use sum function in calculated column

是否可以在计算列中使用求和函数? 如果是,我想创建一个计算列,计算同一 table 中日期小于此条目日期的列的总和。这可能吗? 最后,这是否会在下面的示例视图中优化对该值的重复调用?

SELECT ProductGroup, SalesDate, (
  SELECT SUM(Sales)
  FROM SomeList
  WHERE (ProductGroup= KVU.ProductGroup) AND (SalesDate<= KVU.SalesDate)) AS cumulated
FROM SomeList AS KVU

Is it possible to use a sum function in a calculated column?

是的,可以为您的计算列使用 scalar valued function(标量 UDF),但这将是一场灾难。对计算列使用标量 UDF 会破坏性能。添加访问数据的标量 UDF(此处需要)会使事情变得更糟。

在我看来,您只需要一个好的老式索引来加快处理速度。首先是一些示例数据:

IF OBJECT_ID('dbo.somelist','U')    IS NOT NULL DROP TABLE dbo.somelist;
GO

CREATE TABLE dbo.somelist
(
  ProductGroup INT           NOT NULL,
  [Month]      TINYINT       NOT NULL CHECK ([Month] <= 12),
  Sales        DECIMAL(10,2) NOT NULL
);

INSERT dbo.somelist 
VALUES (1,1,22),(2,1,45),(2,1,25),(2,1,19),(1,2,100),(1,2,200),(2,2,50.55);

和正确的索引:

CREATE NONCLUSTERED INDEX nc_somelist ON dbo.somelist(ProductGroup,[Month])
INCLUDE (Sales);

有了这个索引,这个查询将非常有效:

SELECT   s.ProductGroup, s.[Month], SUM(s.Sales)
FROM     dbo.somelist AS s
GROUP BY s.ProductGroup, s.[Month];

如果您需要按月和产品组获取 COUNT,您可以像这样创建索引视图:

CREATE VIEW dbo.vw_somelist WITH SCHEMABINDING AS 
SELECT   s.ProductGroup, s.[Month], TotalSales = COUNT_BIG(*)
FROM     dbo.somelist AS s
GROUP BY s.ProductGroup, s.[Month];
GO

CREATE UNIQUE CLUSTERED INDEX uq_cl__vw_somelist ON dbo.vw_somelist(ProductGroup, [Month]);

一旦该索引视图就位,您的 COUNT 将被预先聚合。但是,您不能在索引视图中包含 SUM。