#sql #postgresql
#sql #postgresql
Вопрос:
Я хочу вычислить средние значения для некоторых групп элементов, используя следующий запрос
SELECT g.id, i.metric, AVG(i.value) FROM items_group g
JOIN items i ON i.group_id=g.id
GROUP BY g.id, i.metric
Но этот запрос не включает пустые группы в результат. Я хочу иметь 0 значений для этих групп, предполагая, что набор показателей является фиксированным (цена, длина, вес). Желаемый результат для непустой группы 1 и пустой группы 2 равен
group_id|metric|value
__________________________
1 |price |5
1 |length|33
1 |weight|10
2 |price |0
2 |length|0
2 |weight|0
Ответ №1:
Вы могли бы использовать LEFT JOIN
:
SELECT g.id, i.metric, AVG(i.value)
FROM items_group g
LEFT JOIN items i ON i.group_id=g.id
GROUP BY g.id, i.metric
Ответ №2:
Это немного сложно, потому что вам нужно сгенерировать строки, которых нет в исходных данных.
Используйте cross join
для генерации строк. Затем используйте left join
для ввода значений:
SELECT ig.id, m.metric, AVG(i.value)
FROM items_group ig CROSS JOIN
(SELECT DISTINCT i.metric FROM items i) m LEFT JOIN
items i
ON i.group_id = ig.id AND i.metric = m.metric
GROUP BY ig.id, m.metric;
Если у вас есть отдельная таблица показателей, вы можете использовать ее вместо подзапроса для m
.