У меня есть следующая таблица:
account(id, balance, bank_branch)
Я хочу выбрать все счета, на которых остаток на счете больше, чем средний остаток в его отделении bank_branch.
я пробовал
Select id from account where balance > (SELECT avg(balance) from account group by bank_branch)
но подзапрос возвращает более одной строки, поэтому он не работает.
Как я могу добиться чего-то подобного?
Обновлено: образцы данных:
account(1, 200, A)
account(2, 400, A)
account(3, 100, B)
account(4, 300, B)
account 1,2 are in same branch - A
account 3,4 are in same branch - B
avg balance of branch A = 300
avg balance of branch B = 200
hence the output of my query should be 2,4 as
account 2 balance is 400 which is > 300(avg of A)
and account 4 balance is 300 which is > 200(avg of B)






Вы можете попробовать ниже
SELECT id from account where balance > ANY(SELECT avg(balance) FROM account
GROUP BY bank_branch)
ВЫХОД:
id
2
4
Но это опускает тот факт, что баланс должен быть больше, чем средний баланс в своем банке_филиале, ваш ответ принимает средний (баланс) всех ветвей
@JakubLedwon, было бы здорово, если бы вы добавили несколько примеров данных и ожидаемый результат в свой вопрос.
@fa06 Вы правы, мой вопрос был не очень информативным, извините, я добавил некоторые данные
@JakubLedwon, я отредактировал в соответствии с вашими требованиями, вы можете проверить сейчас
я бы снова проголосовал, если бы мог, поскольку я всегда забыл о ключевых словах ANY или ALL SQL, поскольку ваш SQL легче читать, чем связанный подзапрос или самосоединение
Выберите идентификатор из учетной записи, в которой находится баланс (ВЫБЕРИТЕ avg (баланс) из группы учетных записей по банку_филиалу)
Запрос не имеет большого смысла, этот запрос вернет идентификаторы, где баланс равен равный для AVG.
Связанный подзапрос является опцией
Запрос
SELECT
account_out.id
FROM
account account_out
WHERE
EXISTS (
SELECT
1
FROM
account account_in
GROUP BY
account_in.bank_branch
HAVING account_out.balance > AVG(account_in.balance)
);
Результат
| id |
| --- |
| 2 |
| 4 |
см. демо
Также другой вариант избежать использования связанного подзапроса — использовать самосоединение.
Запрос
SELECT
account.id
FROM (
SELECT
account.bank_branch
, AVG(account.balance) AS avg_balance
FROM
account
GROUP BY
account.bank_branch
) AS account_filter
INNER JOIN
account
ON
account_filter.bank_branch = account.bank_branch
AND
account_filter.avg_balance < account.balance
Результат
| id |
| --- |
| 2 |
| 4 |
см. демо
см. Почему я должен предоставить минимально воспроизводимый пример для очень простого SQL-запроса?