SQL AVG применяется к нескольким группам?

Я пытаюсь рассчитать среднее значение столбца по группе для нескольких групп в одном запросе.

Предположим, что есть 2 столбца (a, b), для каждого из которых я хочу получить среднее значение другого столбца (c) на группу первого столбца. Например, это вернет группы a и среднее значение c для каждой группы.

SELECT a, AVG(c)
FROM mytable
GROUP BY a

Это дает мне два столбца.

а СРЕДНЕЕ (с) 1 0,5 2 0,75

Мне нужна таблица с двумя столбцами на столбец группировки, как это.

а СРЕДНЕЕ (с) б СРЕДНЕЕ (с) 1 0,5 8 1,5 2 0,75 9 0,25

Спасибо.

Можете ли вы предоставить образцы данных, поскольку вы предоставили желаемый результат?

Emin Mesic 10.12.2020 13:07

Получите набор строк с двумя столбцами с сервера и преобразуйте его в форму с четырьмя столбцами на клиенте, используя его подсистему отчетов.

Akina 10.12.2020 13:51
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
1 415
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это проще сделать отдельными рядами с union all:

SELECT 'a' as which, a, AVG(c)
FROM mytable
GROUP BY a
UNION ALL
SELECT 'b' as which, b, AVG(c)
FROM mytable
GROUP BY b;

Если вы действительно хотите их бок о бок, запрос немного сложнее:

SELECT MAX(a) as a, MAX(a_avg_c) as a_avg_c,
       MAX(b) as b, MAX(b_avg_c) as b_avg_c
FROM ((SELECT a, AVG(c) as a_avg_c, null as b, null as b_avg_c,
              ROW_NUMBER() OVER (ORDER BY a) as seqnum
       FROM mytable
       GROUP BY a
      ) UNION ALL
      (SELECT null, null, b, AVG(c) as b_avc_c,
              ROW_NUMBER() OVER (ORDER BY b) as seqnum
       FROM mytable
       GROUP BY b
      )
     ) ab
GROUP BY seqnum;

Это сложнее, поскольку SQL рассматривает строку как единое целое. На самом деле вам нужны столбцы в каждой строке, которые совершенно не связаны друг с другом. Таким образом, эта версия создает «отношение», присваивая последовательное значение, а затем выполняя агрегирование по этому значению, чтобы получить то, что вы хотите.

Вы можете использовать analytical function и distinct следующим образом:

Select distinct a,
       Avg(c) over (partition by a) as a_avg,
       B,
       Avg(c) over (partition by b) as b_avg
  From your_table t

Другие вопросы по теме