Как найти среднее значение столбцов в таблицах? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть банковская база данных:

Я хочу получить имя и средний баланс клиентов в конкретном филиале.То есть среднее значение их сберегательного счета и текущего счета в филиале "x".

Я пытался выполнить запрос ниже, но безуспешно.

У меня есть этот запрос:

SELECT DISTINCT customer_name, average_balance FROM 
(

  SELECT account_number, AVG(balance) AS average_balance
  FROM (
      SELECT account_number, balance FROM account WHERE account_number IN (SELECT account_number FROM savings_account)
  UNION ALL
  SELECT account_number, balance FROM account WHERE account_number IN (SELECT account_number FROM checking_account)
  ) AS subquery
  GROUP BY account_number
) AS subquery2 INNER JOIN customer; 

Примеры операторов ввода:

INSERT INTO account VALUES ('ACC-101',  'Rock Ridge', 500000, '');
INSERT INTO account VALUES ('ACC-101',  'Beach Lookout',  1700, '');
INSERT INTO account VALUES ('ACC-102',  'Rock Ridge',  2465, '');
INSERT INTO account VALUES ('ACC-103',  'Rock Ridge',  77350, '');
INSERT INTO account VALUES ('ACC-104',  'Bargin Plaza', 480002, '');
INSERT INTO account VALUES ('ACC-105',  'Supreme Hill', 17000, '');
INSERT INTO account VALUES ('ACC-106',  'Rock Ridge',  5000, '');
INSERT INTO account VALUES ('ACC-107',  'Main Sperem',  3000, '');
INSERT INTO account VALUES ('ACC-108',  'Adus Avenue',  57685, '');


INSERT INTO savings_account VALUES('ACC-101', 0.1);
INSERT INTO savings_account VALUES('ACC-102', 0.7);
INSERT INTO savings_account VALUES('ACC-103',0.6);

INSERT INTO checking_account VALUES('ACC-104', 2000);
INSERT INTO checking_account VALUES('ACC-105', 2000);
INSERT INTO checking_account VALUES('ACC-106', 2000);

INSERT INTO depositor VALUES ('125-233-001',   'ACC-101',  '2012/10/13');
INSERT INTO depositor VALUES ('125-233-001',   'ACC-106',  '2013/09/21');
INSERT INTO depositor VALUES ('125-233-002',   'ACC-102',  '2014/08/11');
INSERT INTO depositor VALUES ('125-233-002',   'ACC-106',  '2015/07/06');
INSERT INTO depositor VALUES ('125-233-004',   'ACC-104',  '2016/06/11');
INSERT INTO depositor VALUES ('125-233-005',   'ACC-105',  '2012/05/17');
INSERT INTO depositor VALUES ('125-233-006',   'ACC-105',  '2018/10/11');
INSERT INTO depositor VALUES ('125-233-007',   'ACC-106',  '2019/02/27');
INSERT INTO depositor VALUES ('125-233-008',   'ACC-106',  '2012/01/31');

Я получаю результат ниже, но это не то, что я ищу

+--------------------+-----------------+
| customer_name      | average_balance |
+--------------------+-----------------+
| Chuck Delroy       |   500000.000000 |
| Chuck Delroy       |     2465.000000 |
| Chuck Delroy       |    77350.000000 |
| Chuck Delroy       |   480002.000000 |
| Chuck Delroy       |    17000.000000 |
| Chuck Delroy       |     5000.000000 |
| Dalrymple Fayval   |   500000.000000 |
| Dalrymple Fayval   |     2465.000000 |
| Dalrymple Fayval   |    77350.000000 |
| Dalrymple Fayval   |   480002.000000 |
| Dalrymple Fayval   |    17000.000000 |
| Dalrymple Fayval   |     5000.000000 |
| Freeman Mark       |   500000.000000 |
| Freeman Mark       |     2465.000000 |
| Freeman Mark       |    77350.000000 |
| Freeman Mark       |   480002.000000 |
| Freeman Mark       |    17000.000000 |
| Freeman Mark       |     5000.000000 |
| Trisman Kemar      |     2465.000000 |
| Trisman Kemar      |    77350.000000 |
| Trisman Kemar      |   480002.000000 |
| Trisman Kemar      |    17000.000000 |
| Trisman Kemar      |     5000.000000 |
+--------------------+-----------------+

Пример: я на самом деле ищу:

+--------------------+-----------------+
|Delroy Chuck        | 252,500.00.     |
+--------------------+-----------------+

Это потому, что у него будет 500 000 на его сберегательном счете и 5000 на его текущем счете.

1 Ответ

0 голосов
/ 28 февраля 2019

Я не вижу полей для присоединения к клиенту, поэтому я предполагаю, что в таблицах account и customer есть поле customer_number.

Сначала из исходного запроса,

SELECT account_number, balance FROM account WHERE account_number IN (SELECT account_number FROM savings_account)

можно упростить до

SELECT account_number, balance
FROM account
  INNER JOIN savings_account ON account.account_number = savings_account.account_number

Мы хотим включить сюда клиента для агрегирования среднего.

SELECT customer.customer_number, customer.customer_name, savings_account.account_number, savings_account.balance
FROM savings_account
  INNER JOIN account ON account.account_number = savings_account.account_number
  INNER JOIN customer ON account.customer_number = customer.customer_number

сейчас, для следующегошаг, который мы объединяем с check_account.

SELECT customer.customer_number, customer.customer_name, checking_account.account_number, checking_account.balance
FROM checking_account
  INNER JOIN account ON account.account_number = checking_account.account_number
  INNER JOIN customer ON account.customer_number = customer.customer_number

, тогда этот запрос может быть агрегирован с group by.

перед:

SELECT customer_name, avg(balance)
FROM
(

    SELECT customer.customer_number, customer.customer_name, account.account_number, account.balance
    FROM  account
      INNER JOIN savings_account ON account.account_number = savings_account.account_number
      INNER JOIN customer ON account.customer_number = customer.customer_number

  UNION ALL
    SELECT customer.customer_number, customer.customer_name, account.account_number, account.balance
    FROM account
      INNER JOIN checking_account ON account.account_number = checking_account.account_number
      INNER JOIN customer ON account.customer_number = customer.customer_number
) AS subquery2
GROUP BY customer_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...