Почему он не показывает функцию с одной группой?

#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 . , , Вам нужно пометить свой вопрос базой данных, которую вы используете.