Группировка дважды по разным критериям, один и тот же столбец - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть данные со следующими столбцами:

OFFICER_ID, CLIENT_ID, SECURITY_CODE, POSITION_SIZE 

, а затем по каждой строке, например:

officer1, client100, securityZYX, $100k,
officer2, client124, securityADF, $200k,
officer1, client130, securityARR, $150k,
officer4, client452, securityADF, $200k,
officer2, client124, securityARR, $500k,
officer7, client108, securityZYX, $223k, 
and so on.

Как видите, у каждого клиента есть один сотрудник, назначенный либокупить или продать ценные бумаги, но каждый клиент мог купить разные ценные бумаги.

Помимо рейтинговых офицеров по общей сумме в долларах США ценных бумаг, находящихся у их клиентов (что я и сделал), мне нужно создать диапазоны общегоучетные записи клиентов путем добавления общего количества ценных бумаг, удерживаемых по идентификатору клиента, например, общая сумма ценных бумаг <1 миллион долларов, от 1 до 3 миллионов долларов и> 3 миллионов долларов.

Я пытался:

SELECT officer_ID, SUM(position_size) as AUM
FROM trades
GROUP BY client_ID
HAVING AUM > 1000000 AND AUM < 3000000; 

и я получаю список всех офицеров, появляющихся несколько раз, без итогов.

Мне нужно простое:

Officer_ID | range < 1m | range 1m-3m | range > 3m

employee1, [общая сумма клиентских счетов с ценными бумагамисуммирование <итогов 1м], [общее количество клиентских счетов с суммарными ценными бумагами от 1м до 3м] и т. д. </p>

Пожалуйста, не могли бы вы указать мне правильное направление?

ОБНОВЛЕНИЕ

Я изменил предложенный Тимом код и получил желаемый результат:

SELECT
    OFFICER_ID,
    SUM(CASE WHEN total < 1000000 THEN total END) AS "range < 1m",
    SUM(CASE WHEN total >= 1000000 AND total < 3000000 THEN total END) AS "range 1m-3m",
    SUM(CASE WHEN total >= 3000000 THEN total END) AS "range > 3m"
FROM
(
    SELECT OFFICER_ID, CLIENT_ID, SUM(POSITION_SIZE) AS total
    FROM trades
    GROUP BY OFFICER_ID, CLIENT_ID
) t
GROUP BY
    OFFICER_ID;

Слишком добрый, Тим, спасибо!

1 Ответ

0 голосов
/ 27 ноября 2018

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

SELECT
    OFFICER_ID,
    COUNT(CASE WHEN total < 1000000 THEN 1 END) AS "range < 1m",
    COUNT(CASE WHEN total >= 1000000 AND total < 3000000 THEN 1 END) AS "range 1m-3m",
    COUNT(CASE WHEN total >= 3000000 THEN 1 END) AS "range > 3m"
FROM
(
    SELECT OFFICER_ID, CLIENT_ID, SUM(POSITION_SIZE) AS total
    FROM trades
    GROUP BY OFFICER_ID, CLIENT_ID
) t
GROUP BY
    OFFICER_ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...