在计算列中使用求和函数
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。
是否可以在计算列中使用求和函数? 如果是,我想创建一个计算列,计算同一 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。