Я пытаюсь рассчитать среднее значение столбца по группе для нескольких групп в одном запросе.
Предположим, что есть 2 столбца (a, b), для каждого из которых я хочу получить среднее значение другого столбца (c) на группу первого столбца. Например, это вернет группы a и среднее значение c для каждой группы.
SELECT a, AVG(c)
FROM mytable
GROUP BY a
Это дает мне два столбца.
Мне нужна таблица с двумя столбцами на столбец группировки, как это.
Спасибо.
Получите набор строк с двумя столбцами с сервера и преобразуйте его в форму с четырьмя столбцами на клиенте, используя его подсистему отчетов.
Это проще сделать отдельными рядами с 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
Можете ли вы предоставить образцы данных, поскольку вы предоставили желаемый результат?