Как суммировать столбец на основе двух условий, одно на основе значения поля, другое на основе значений извлеченной записи? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть список, подобный приведенному ниже, из которого я собираюсь собрать сумму в столбце «сумма» для данной компании. Хитрость в том, что я хочу включить членов семьи сотрудников компании. Эти отношения хранятся с помощью идентификатора справа и будут отличаться на 12-й символ (если в рассматриваемой семье только один член, то 12-й символ - это пробел).

Sample Data

У меня вопрос: какой самый эффективный способ получить сумму для всех сотрудников ABC Inc, включая членов семьи. Я полагаю, что для этого потребуется сначала один запрос для всех сотрудников ABC Inc, а затем еще один для членов их семей с использованием результирующего списка из первого запроса.

Это самый эффективный способ сделать это? Моя таблица очень большая (более 10 ГБ плоских данных), и потребуются тысячи таких запросов, поэтому важна эффективность.

Код, который я использую до сих пор для получения данных без членов семьи:

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 голосов
/ 01 мая 2019

Я думаю, что вы хотите:

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
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...