#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 Все хорошо. Просто примечание. Некоторые интервьюеры могут посчитать этот синтаксис устаревшим.