MySql больше, чем с группой на

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

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)
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
147
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать ниже

ДЕМО

 SELECT id from account where balance > ANY(SELECT avg(balance) FROM account
     GROUP BY bank_branch)

ВЫХОД:

id
2
4

Но это опускает тот факт, что баланс должен быть больше, чем средний баланс в своем банке_филиале, ваш ответ принимает средний (баланс) всех ветвей

leedwon 11.06.2019 15:27

@JakubLedwon, было бы здорово, если бы вы добавили несколько примеров данных и ожидаемый результат в свой вопрос.

Fahmi 11.06.2019 15:28
«Но это опускает тот факт, что баланс должен быть больше, чем средний баланс в своем банке_филиале, ваш ответ принимает средний (баланс) всех филиалов» @JakubLedwon, основываясь на доступной информации в вопросе, которой было немного, fa06 сделал (очень) приличное обоснованное предположение, чтобы получить лучшие ответы, см. Почему я должен предоставить минимально воспроизводимый пример для очень простого SQL-запроса?
Raymond Nijland 11.06.2019 15:28

@fa06 Вы правы, мой вопрос был не очень информативным, извините, я добавил некоторые данные

leedwon 11.06.2019 15:34

@JakubLedwon, я отредактировал в соответствии с вашими требованиями, вы можете проверить сейчас

Fahmi 11.06.2019 15:39

я бы снова проголосовал, если бы мог, поскольку я всегда забыл о ключевых словах ANY или ALL SQL, поскольку ваш SQL легче читать, чем связанный подзапрос или самосоединение

Raymond Nijland 11.06.2019 16:00

Выберите идентификатор из учетной записи, в которой находится баланс (ВЫБЕРИТЕ avg (баланс) из группы учетных записей по банку_филиалу)

Запрос не имеет большого смысла, этот запрос вернет идентификаторы, где баланс равен равный для AVG.

Raymond Nijland 11.06.2019 15:33
Ответ принят как подходящий

Связанный подзапрос является опцией

Запрос

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   |

см. демо

Другие вопросы по теме