Как подсчитать количество банковских счетов, принадлежащих одному пользователю в Oracle SQL

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть несколько вопросов относительно использования GROUP BY в SQL,

Как подсчитать количество открытых банковских счетов, принадлежащих одному конкретному пользователю? Я попытался написать максимально правильное предложение, чтобы SQL мог подсчитывать все связанные учетные записи каждого пользователя, вместо этого результат несколько прост? Он просто показывает 1s во всех запросах…

 SELECT DISTINCT RPAD(CLI.NOMBRE || '  ' ||CLI.APELLIDOS,30) "Nombre y Apellidos",
                SUM(CUE.SALDO) "Saldo", COUNT(CUE.COD_CUENTA) "Cuentas Abiertas"
from CLIENTE CLI,
     CUENTA CUE
WHERE CLI.COD_CLIENTE = CUE.COD_CLIENTE
GROUP BY CLI.NOMBRE, CLI.APELLIDOS, CUE.SALDO, CUE.COD_CUENTA
 

В моем случае я пытался искать пользователей с именем и фамилиями, а также подсчитывать учетные записи, которые открыли пользователи, вместо этого запрос повторяет имена, а «Счетчик» показывает 1s в качестве результата

[Результат] [1]; [Диаграмма E / R] [2]

Заранее спасибо!!! [1]: https://i.stack.imgur.com/AQDac.png
[2]: https://i.stack.imgur.com/jlVte.png

Комментарии:

1. Совет сегодняшнего дня: переключитесь на современный, явный JOIN синтаксис! Проще писать (без ошибок), легче читать и поддерживать, и легче преобразовать во внешнее соединение, если это необходимо!

Ответ №1:

Вы группируете по SALDO и, COD_CUENTA и это предотвращает традиционные подсчеты агрегирования для отображения нужного результата.

Однако вы можете использовать функцию window: вам нужно сообщить COUNT() функции о области, в которой она должна выполнять добавление OVER(PARTITION BY cli.cod_cliente) .

Например:

 select distinct 
  rpad(cli.nombre || '  ' || cli.apellidos, 30) as "nombre y apellidos",
  sum(cue.saldo) as "saldo",
  count(cue.cod_cuenta) over(partition by cli.cod_cliente) as "cuentas abiertas"
from cliente cli
join cuenta cue on cli.cod_cliente = cue.cod_cliente
group by cli.nombre, cli.apellidos, cue.saldo, cue.cod_cuenta
 

ПРИМЕЧАНИЕ: Пожалуйста, используйте современный синтаксис объединения, а не те объединения, которые были в 80-х годах. Я обновил ваш запрос.

Комментарии:

1. Большое вам спасибо! Что касается объединений, это синтаксисы, которым меня учат в школе, поэтому я действительно не знал, что будут более «современные» способы написания запроса, я буду иметь это в виду и улучшу свое написание, если это так 🙂

2. @AliSadykov Какая школа? Я удивлен, что они все еще преподают технологии 80-х годов.

3. Ну, это испанская школа в Барселоне, они предлагают профессиональное образование, чтобы такие люди, как я, могли найти работу в определенной области знаний, хотя я никогда не знал, что способ написания этих синтаксисов был из эпохи Чена, так что это так, но у меня такое чувство, что мой учитель знаетэто уже, но поскольку ОБЪЕДИНЕНИЯ легко написать таким образом, он думал, что мы могли бы использовать их без каких-либо проблем, тот факт, что SQL developer позволяет нам писать «по-старому», а DBeaver — нет, немного смущает меня и моих одноклассников

4. @AliSadykov Все хорошо. Просто примечание. Некоторые интервьюеры могут посчитать этот синтаксис устаревшим.