#sql #oracle
#sql #Oracle
Вопрос:
Я хочу получить количество стран региона 2, название первой страны и количество местоположений стран в регионе 2.
Таким образом, он не показывает функцию с одной группой. Знаете ли вы, почему он показывает эту ошибку и как ее правильно решить?
select country_id, count(*),
(select country_name from hr.countries order by country_name ASC fetch first row only) as number_countries ,
(select count(*) from hr.locations where country_id = country_id)
from hr.countries where region_id = 2;
Комментарии:
1. Похоже, что ваш запрос не принесет ничего полезного, даже если синтаксические ошибки были исправлены. Я бы посоветовал вам задать новый вопрос с примерами данных, желаемыми результатами и четким объяснением того, чего вы хотите достичь.
2. Какую СУБД вы используете? Вопросы SQL всегда должны быть помечены СУБД, потому что СУБД различаются в отношении функций SQL, которые они поддерживают.
Ответ №1:
Вы не можете использовать неагрегированный столбец в select, не имея его в group by. Например, у вас есть неагрегированный столбец country_id в вашем select (это означает, что вы не используете какую-либо агрегатную функцию в этом столбце, такую как sum, max, min и т. Д.), Поэтому вам нужно использовать
Group by country_id
В вашем случае —
select country_id, count(*),
(select country_name from hr.countries order by country_name
ASC fetch first row only) as number_countries ,
(select count(*) from hr.locations where country_id = country_id)
from hr.countries where region_id = 2
group by country_id;
В противном случае произойдет сбой. Другим вариантом было бы удалить неагрегированный столбец — в вашем случае country_id из select и просто сохранить те, у которых есть агрегированная функция.
Комментарии:
1. Спасибо, но так, как будто это всегда показывает, что количество равно 1. И, например, в регионе 2 есть 5 стран.
Ответ №2:
Ваш запрос недействителен, потому что вы объединяете свои строки в одну результирующую строку, но указываете СУБД показывать country_id . Какой?
Что касается запроса: просто соедините таблицы и посчитайте:
select
min(country_id),
count(distinct country_id) as country_count,
count(*) as location_count
from hr.countries c
join hr.locations l using (country_id)
where c.region_id = 2;
Комментарии:
1. Спасибо, но также и без идентификатора country_id, например «выберите count( ), (выберите country_name из hr.countries порядок по имени страны ASC выборка только первой строки) как number_countries , (выберите count( ) из hr.locations, где country_id = country_id) из hr.countries, где region_id = 2;» показывает ту же ошибку.
2. В вашем решении кажется, что выходные данные отображаются неправильно, например, отображается идентификатор country_id ‘BR’, но первая страна должна быть «AR». На выходе должно отображаться количество стран этого региона 2, название первой страны и количество местоположений из стран региона 2.
3. Ваш первый комментарий: правильный, потому что второй подзапрос получает одно значение для каждой страны. Вам нужно будет добавить это :
sum((select count(*) from hr.locations ...))
.4. Ваш второй комментарий: я уверен, что вы ошибаетесь.
WHERE
Предложение ограничивает строки, чтобы получить только область 2. Соединение стран и местоположений включеноcountry_id
, так как жеcount(distinct country_id)
не удалось получить количество стран в регионе 2? И как быcount(*)
не считать его местоположения?MIN(country_id)
получает первую страну, упорядоченную по идентификатору. Если для региона есть два идентификатора ‘AR’ и ‘BR’, вы получите ‘AR’, потому что он стоит первым в алфавите.MIN(country_id)
однако название страны не учитывается.5. Вы все еще не рассказали нам о своей СУБД. Что вы используете? MySQL? SQL Server? Oracle? PostgreSQL ? …
Ответ №3:
Я хочу получить количество стран региона 2, название первой страны и количество местоположений стран в регионе 2.
Мое лучшее предположение для этого запроса:
select (select count(*) from hr.countries where region_id = 2) as number_countries,
(select min(country_name) from hr.countries) as first_contry,
(select count(*)
from hr.locations l join
hr.countries c
on l.country_id = c.country_id
where c.region_id = 2
) as num_locations
Комментарии:
1. Спасибо, что он показывает, что ключевое слово from не найдено там, где ожидалось.
2. @Jack . , , Вам нужно пометить свой вопрос базой данных, которую вы используете.