关联表中的SQL Server汇总(总和)值
我有以下情况。我有一个“客户”表(父表)和一个“机会”表子表。(见下面的例子) 客户表关联表中的SQL Server汇总(总和)值,sql,sql-server,Sql,Sql Server,我有以下情况。我有一个“客户”表(父表)和一个“机会”表子表。(见下面的例子) 客户表 | Id | Name ------------------ |1 | Client A |2 | Client B |3 | Client C 机会表 | Id | ClientId | Value --------------------------------- | 10 | 1 | 1000 | 11
| Id | Name
------------------
|1 | Client A
|2 | Client B
|3 | Client C
机会表
| Id | ClientId | Value
---------------------------------
| 10 | 1 | 1000
| 11 | 1 | 3000
| 12 | 2 | 1500
| 13 | 3 | 2000
我想在客户记录上显示所有Opportunity Value(OppValue)总和
预期产量
| Id | Name | OppValue
-----------------------------
|1 | Client A | 4000
|2 | Client B | 1500
|3 | Client C | 2000
业务需求是使用以下条件筛选“OppValue”,即大于、小于或空等,但不按opportunity create date等。我们预计每年用户将增加500个客户和45000个新opportunity。基于上述情况,我可以想出三个选择
非常感谢。请使用
内部联接
和sum()
函数尝试以下查询。要了解更多有关内部联接的信息,请遵循以下步骤。您可以详细了解
输出
Id Name Value
----------------------
1 Client A 4000
2 Client B 1500
3 Client C 2000
要创建视图,可以使用以下创建视图示例
语法:
Create View <ViewName>
as
<View Query>
从上面创建的视图中选择结果
select * from MyView
从视图开始:
create view client_opp as (
select c.*, o.oppvalue
from client c outer apply
(select sum(oppvalue) as oppvalue
from opportunities o
where o.clientId = c.clientId
) o;
确保您在opportunities(clientId,oppvalue)
上有索引,或者至少在opportunities(clientId)
上有索引。请注意,这非常明确地使用了apply
,因此即使在带有附加过滤的查询中使用该视图,也应该可以很好地工作
如果这在性能方面起作用,那么您就完成了。使用触发器和UDF的其他方法需要在数据库中进行更多的维护。您当然可以使用它们,但我建议您等待,看看这是否满足您的性能需求。您可以使用
apply
:
create view client_view as
select c.*, ot.OppValue
from ClientTable c cross apply
( select sum(value) as OppValue
from OpportunityTable ot
where ot.ClientId = c.ClientId
) ot;
我更希望根据我在帖子中提出的3种可能的方法来推荐。这个答案给出了两个选项:使用查询还是创建视图?现在还不太清楚应该使用哪一种以及使用它的优点?这似乎是最好的方法,性能很好,我已经运行了一些性能测试。
create view client_opp as (
select c.*, o.oppvalue
from client c outer apply
(select sum(oppvalue) as oppvalue
from opportunities o
where o.clientId = c.clientId
) o;
create view client_view as
select c.*, ot.OppValue
from ClientTable c cross apply
( select sum(value) as OppValue
from OpportunityTable ot
where ot.ClientId = c.ClientId
) ot;