Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关联表中的SQL Server汇总(总和)值_Sql_Sql Server - Fatal编程技术网

关联表中的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。基于上述情况,我可以想出三个选择

  • 使用SQL查询计算值(分组依据或分区依据)
  • 使用自定义项创建视图或计算字段
  • 在“Client”表中创建一个新字段,并使用应用程序业务逻辑(SQL外部)填充它 您认为哪种解决方案在用户体验(速度)和维护方面效果最好? 如果有更好的建议,请告诉我


    非常感谢。

    请使用
    内部联接
    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;