如何基于两个条件对一列求和,一个基于字段值,另一个基于检索到的记录的值?

时间:2019-04-30 23:00:03

标签: sql sql-server

我有一个类似下面的列表,我希望从该列表中汇总给定公司的“金额”列中的总和。问题的关键是我想包括公司员工的家庭成员。这些关系由ID保留在右侧,并以第12个字符不同(如果所讨论的家庭只有一名成员,则第12个字符为空格)。

Sample Data

我的问题是,为ABC Inc的所有员工(包括家庭成员)获取金额的最有效方法是什么?我相信这将首先需要对ABC Inc的所有员工进行查询,然后再使用查询一的结果列表来查询其家庭成员。

这是最有效的方法吗?我的表非常大(超过10GB的平面数据),并且将需要成千上万个这样的查询,因此效率非常重要。

到目前为止,我用于获取没有家人的数据的代码是:

select ID, Name, Company_Name,  sum(Amount) from indivs
where Orgname ='APC Inc' --or Employer like '%APC Inc%'
group by ID, Name,  Company_Name

但是,这只给了我直接雇员的钱。

下一步要增加家庭成员的金额吗?

1 个答案:

答案 0 :(得分:0)

我想你想要

select sum(amount)
from t
where exists (select 1
              from t t2
              where t2.company = 'APC Inc.' and
                    left(t2.id, 11) = left(t.id, 11)
             );

为了提高性能,您可以创建一个计算列和索引:

alter table t add id11 as (left(id, 11)) persisted;

create index idx_company_id11 on t(company, id11);

然后将查询短语设置为:

select sum(amount)
from t
where exists (select 1
              from t t2
              where t2.company = 'APC Inc.' and
                    t2.id11 = t.id11
             );
相关问题